Libraries used in the Project and uploading data
library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
method from
print.tbl_lazy
print.tbl_sql
── Attaching packages ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.0 ──
✓ ggplot2 3.3.3 ✓ purrr 0.3.4
✓ tibble 3.0.3 ✓ dplyr 1.0.2
✓ tidyr 1.1.2 ✓ stringr 1.4.0
✓ readr 1.4.0 ✓ forcats 0.5.0
── Conflicts ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
x dplyr::filter() masks stats::filter()
x dplyr::lag() masks stats::lag()
library(dplyr)
library(stringr)
library(svMisc)
Attaching package: ‘svMisc’
The following object is masked from ‘package:utils’:
?
library(ggplot2)
library(gtable)
library("ggpubr")
Registered S3 method overwritten by 'data.table':
method from
print.data.table
log_data <- read_csv("~/Desktop/PAE/github/data/logData.csv")
── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
callerId = col_double(),
langId = col_double(),
callTime = col_datetime(format = ""),
lastCallTime = col_character(),
noCallsMade = col_double(),
noContentListened = col_double(),
callId = col_character(),
eventTime = col_datetime(format = ""),
logInfo = col_character(),
logInfoId = col_double(),
inSurvey = col_logical()
)
log_data_saver <- log_data
log_data <- unique(log_data)
View(per_call_df)
log_data$logInfo <- str_replace(log_data$logInfo, " ", " ")
#MAKE IT ALL UPPER!!!
log_data$logInfo <- toupper(log_data$logInfo)
### GETTING THE DATE MONTH AND YEAR IF I WANT!!!
extractdate <- function(date) {
day <- format(date, format="%d")
month <- format(date, format="%m")
year <- format(date, format="%Y")
cbind(day, month, year)
}
#making first calls
first_call<-extractdate(log_data$callTime)
#making last call
last_day <-substr(log_data$lastCallTime, 9, 10)
last_month <- substr(log_data$lastCallTime, 6, 7)
last_year <-substr(log_data$lastCallTime, 1, 4)
log_data<-cbind(log_data, first_call,last_day,last_month,last_year)
#Converting columns to numeric
log_data$day <-as.numeric(log_data$day)
log_data$last_day <- as.numeric(log_data$last_day)
NAs introduced by coercion
log_data$month <-as.numeric(log_data$month)
log_data$last_month <- as.numeric(log_data$last_month)
NAs introduced by coercion
log_data$year <- as.numeric(log_data$year)
log_data$last_year <- as.numeric(log_data$last_year )
NAs introduced by coercion
log_data$year <- log_data$year +log_data$month/12
log_data$last_year <- log_data$last_year + log_data$last_month/12
log_data$caller_lifetime <- log_data$last_year - log_data$year
Cmd+Option+I.
Cmd+Shift+K
PRELIMINARY DISTRIBUTIONS
In this section, we display some of the basic distributions of the data including languages, total lifeetime of a given caller, colls made, content accessed, and the ratio of content listened to calls made.
Based on the graphs below, we are nervous that some of the data is not random given the incredibly high ratio for content listened to calls made, but given that the data is distributed fairly evenly across thee different graphs, we are unsure
lang_spoken <- log_data %>%
group_by(callerId, langId) %>%
count()
#Distribution of languages spoken
ggplot(data=lang_spoken, aes(x=langId)) +
geom_bar()+
labs(
title = 'Distribution of Languages
1 = Amharic, 2=Oromiffa, 3=Tigrigna, 4=Wolayitta, and 5=Sidamigna',
x = 'Language',
y= 'count'
)

#Distribution of time difference bewtween first and last call
lifetime<- log_data %>%
group_by(callerId, caller_lifetime) %>%
count()
ggplot(data=lifetime, aes(x=caller_lifetime)) +
geom_histogram(fill='brown', color='black')+
labs(
title = 'Distribution of Call Lifetimes',
x = 'Years between First and Last Call',
y= 'count'
)

#distribution of calls made
calls_made <- log_data %>%
group_by(callerId, noCallsMade) %>%
count()
ggplot(calls_made, aes(x=noCallsMade)) +
geom_histogram(color="black", fill="blue") +
xlim(0,350) +
labs(
title = 'Distribution of calls made per individual over lifetime (Outliers Excluded) \n
Min. 1st Qu. Median Mean 3rd Qu. Max.
3.0 45.0 69.0 99.9 106.0 7110.0 ',
x = 'Total number of calls'
)

content_listened <- filter(log_data, grepl("CONTENT",logInfo))
content_listened <- filter(content_listened , !grepl("CONTENT MENU",logInfo))
content_listened <- filter(content_listened , !grepl("CONTENT IS NOT AVAILABLE",logInfo))
#Creating a content#_played column
content_listened$content_played <- ifelse(str_detect(content_listened$logInfo, 'CONTENT PLAYED', negate = FALSE),1,0)
content_listened$replay_request <- ifelse(str_detect(content_listened$logInfo, 'CONTENT REPLAY REQUESTED', negate = FALSE),1,0)
content_played<-aggregate(content_listened$content_played,list(content_listened$callerId), FUN=sum)
?rename
content_played <- content_played %>%
dplyr::rename(
con_play = x,
callerId = Group.1
)
content_replay<-aggregate(content_listened$replay_request,list(content_listened$callerId), FUN=sum)
content_replay <- content_replay %>%
dplyr::rename(
con_replay = x,
callerId = Group.1
)
content_counts <- cbind(content_played, content_replay)
content_counts$adjusted_con <- content_counts$con_play-content_counts$con_replay
content_counts$callerId <- NULL
summary(content_counts$adjusted_con)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.00 3.00 8.00 17.79 20.00 279.00
#graphing the true distribution of content played
ggplot(content_counts, aes(x=adjusted_con)) +
geom_histogram(color="black", fill="green") +
xlim(0,100) +
labs(
title = 'Distribution of total Content listened to all Across all Calls (Outliers Excluded) \n
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.00 3.00 8.00 17.79 20.00 279.00 ',
x = 'Total Content Listen Across Calls'
)

# Getting the number of calls per person
calls_made <- log_data %>%
dplyr::group_by(callId) %>%
count()
calls_made_id <- log_data %>%
dplyr::group_by(callId, callerId) %>%
count()
#join between tables
content_ratio <- left_join(calls_made_id, content_counts,by="callerId")
content_ratio[is.na(content_ratio)] <- 0
content_ratio <- content_ratio %>%
dplyr::group_by(callerId, con_play, con_replay, adjusted_con) %>%
count()
content_ratio$ratio <- content_ratio$adjusted_con/content_ratio$n
summary(content_ratio$ratio)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.0000 0.3968 0.8571 1.0800 1.4568 13.4000
ggplot(content_ratio, aes(x=ratio)) +
geom_histogram(color="black", fill="red") +
xlim(0,2)+
labs(
title = 'Distribution of ratio of content listened to Calls (Outliers Excluded) \n
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.0000 0.5614 1.0000 1.2500 1.5292 13.4000 ',
x = 'Content to Call Ratio'
)

sum(content_ratio$n)
[1] 16445
RAIN MENU/PRE PLANTING MENU/LAND PREPARATION
We continue our pattern of following the most accessed submenu from the previous subment - land preparation! This is also the bottom of a tree. We will breakdown conent selection by language and overall
INCOMING CALL STARTED –> WELCOME MESSAGE PLAYED –> RANDOM EXPERIMENT –>
TOP MENU –> RAIN MENU –> PRE PLANTING MENU –> LAND PREPARATION
LAND PREPARATION
- BARLEY
- MAIZE
- SORGHUM
- TEF
- WHEAT
- SESAME
- FAVA BEAN
- CHICKPEA
- COMMON BEAN
- COTTON
ORDER UNKOWN:
- RICE
- DURAME WHEAT
- LENTIL
- MALT BARLEY
#GETTING THE CROP MENU FROM MENU 1 (rain/preplanting/land preparation sub menu)
land_prep <- filter(log_data, grepl("CONTENT PLAYED - LAND PREPARATION - ",logInfo))
land_prep_final <- land_prep %>%
group_by(callerId, logInfo, langId) %>%
count()
land_prep_final$logInfo<- str_replace(land_prep_final$logInfo, "CONTENT PLAYED - LAND PREPARATION -", "")
ggplot(data=land_prep_final, aes(x=logInfo)) +
theme(axis.text.x = element_text(angle = 45, hjust=2))+
geom_bar()+
labs(
title = 'RAIN MENU/PRE PLANTING/LAND PREPARATION
content actually played by language',
x = 'Content Played',
y= 'count'
)

#get rid of the language breakdown
land_prep_no_lang <- land_prep_final
land_prep_no_lang$logInfo<- str_replace(land_prep_no_lang$logInfo, "- AMHARIC", "")
land_prep_no_lang$logInfo<- str_replace(land_prep_no_lang$logInfo, "- OROMIFFA", "")
land_prep_no_lang$logInfo<- str_replace(land_prep_no_lang$logInfo, "- TIGRIGNA", "")
land_prep_no_lang$logInfo<- str_replace(land_prep_no_lang$logInfo, "- WOLAYITTA", "")
land_prep_no_lang$logInfo<- str_replace(land_prep_no_lang$logInfo, "- WOLAYTIGNA", "")
land_prep_no_lang$logInfo<- str_replace(land_prep_no_lang$logInfo, "- SIDAMIGNA", "")
ggplot(land_prep_no_lang, aes(x=logInfo)) +
theme(axis.text.x = element_text(angle = 90))+
geom_bar()+
labs(
title = 'RAIN MENU/PRE PLANTING/LAND PREPARATION
content played overall',
x = 'Content Played',
y= 'count'
)

ggplot(land_prep_no_lang, aes(langId, fill = logInfo)) +
geom_bar()+
labs(
title = 'ALTERNATIVE RAIN MENU/PRE PLANTING/LAND PREPARATION
content actually played by language
1 = Amharic, 2=Oromiffa, 3=Tigrigna, 4=Wolayitta, and 5=Sidamigna
',
x = 'Language'
)

BIG TAKEAWAY: 35% of users end up accessing the maize menu at some point! Wheat, Tef, Sorghum, and Barley also appear to be qualitatively significant
There is no menu to go deeper in, so let’s go back up a level and check to see if other branches have a lot of access
LS0tCnRpdGxlOiAiUEFELUFUQSBDYWxsIExvZyBBbmFseXNpcyIKb3V0cHV0OgogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0Ci0tLQoKIyMjIyBMaWJyYXJpZXMgdXNlZCBpbiB0aGUgUHJvamVjdCBhbmQgdXBsb2FkaW5nIGRhdGEKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShkcGx5cikKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KHN2TWlzYykKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGd0YWJsZSkKbGlicmFyeSgiZ2dwdWJyIikKCmxvZ19kYXRhIDwtIHJlYWRfY3N2KCJ+L0Rlc2t0b3AvUEFFL2dpdGh1Yi9kYXRhL2xvZ0RhdGEuY3N2IikKCmxvZ19kYXRhX3NhdmVyIDwtIGxvZ19kYXRhCgpsb2dfZGF0YSA8LSB1bmlxdWUobG9nX2RhdGEpCgpsb2dfZGF0YSRsb2dJbmZvIDwtIHN0cl9yZXBsYWNlKGxvZ19kYXRhJGxvZ0luZm8sICIgICIsICIgIikKCiNNQUtFIElUIEFMTCBVUFBFUiEhIQoKbG9nX2RhdGEkbG9nSW5mbyA8LSB0b3VwcGVyKGxvZ19kYXRhJGxvZ0luZm8pCgojIyMgR0VUVElORyBUSEUgREFURSBNT05USCBBTkQgWUVBUiBJRiBJIFdBTlQhISEKZXh0cmFjdGRhdGUgPC0gZnVuY3Rpb24oZGF0ZSkgewogICAgZGF5IDwtIGZvcm1hdChkYXRlLCBmb3JtYXQ9IiVkIikKICAgIG1vbnRoIDwtIGZvcm1hdChkYXRlLCBmb3JtYXQ9IiVtIikKICAgIHllYXIgPC0gZm9ybWF0KGRhdGUsIGZvcm1hdD0iJVkiKQoKICAgIGNiaW5kKGRheSwgbW9udGgsIHllYXIpCn0KCiNtYWtpbmcgZmlyc3QgY2FsbHMKZmlyc3RfY2FsbDwtZXh0cmFjdGRhdGUobG9nX2RhdGEkY2FsbFRpbWUpCgoKI21ha2luZyBsYXN0IGNhbGwKbGFzdF9kYXkgPC1zdWJzdHIobG9nX2RhdGEkbGFzdENhbGxUaW1lLCA5LCAxMCkKbGFzdF9tb250aCA8LSBzdWJzdHIobG9nX2RhdGEkbGFzdENhbGxUaW1lLCA2LCA3KQpsYXN0X3llYXIgPC1zdWJzdHIobG9nX2RhdGEkbGFzdENhbGxUaW1lLCAxLCA0KQoKbG9nX2RhdGE8LWNiaW5kKGxvZ19kYXRhLCBmaXJzdF9jYWxsLGxhc3RfZGF5LGxhc3RfbW9udGgsbGFzdF95ZWFyKQoKI0NvbnZlcnRpbmcgY29sdW1ucyB0byBudW1lcmljCmxvZ19kYXRhJGRheSA8LWFzLm51bWVyaWMobG9nX2RhdGEkZGF5KQpsb2dfZGF0YSRsYXN0X2RheSA8LSBhcy5udW1lcmljKGxvZ19kYXRhJGxhc3RfZGF5KQpsb2dfZGF0YSRtb250aCA8LWFzLm51bWVyaWMobG9nX2RhdGEkbW9udGgpCmxvZ19kYXRhJGxhc3RfbW9udGggPC0gYXMubnVtZXJpYyhsb2dfZGF0YSRsYXN0X21vbnRoKQpsb2dfZGF0YSR5ZWFyIDwtIGFzLm51bWVyaWMobG9nX2RhdGEkeWVhcikKbG9nX2RhdGEkbGFzdF95ZWFyIDwtIGFzLm51bWVyaWMobG9nX2RhdGEkbGFzdF95ZWFyICkKCgpsb2dfZGF0YSR5ZWFyIDwtIGxvZ19kYXRhJHllYXIgK2xvZ19kYXRhJG1vbnRoLzEyCmxvZ19kYXRhJGxhc3RfeWVhciA8LSBsb2dfZGF0YSRsYXN0X3llYXIgKyBsb2dfZGF0YSRsYXN0X21vbnRoLzEyCgpsb2dfZGF0YSRjYWxsZXJfbGlmZXRpbWUgPC0gbG9nX2RhdGEkbGFzdF95ZWFyIC0gbG9nX2RhdGEkeWVhcgpgYGAKCipDbWQrT3B0aW9uK0kqLgoKICpDbWQrU2hpZnQrSyogCiAKIyMjIFBSRUxJTUlOQVJZIERJU1RSSUJVVElPTlMKIAoqKkluIHRoaXMgc2VjdGlvbiwgd2UgZGlzcGxheSBzb21lIG9mIHRoZSBiYXNpYyBkaXN0cmlidXRpb25zIG9mIHRoZSBkYXRhIGluY2x1ZGluZyBsYW5ndWFnZXMsIHRvdGFsIGxpZmVldGltZSBvZiBhIGdpdmVuIGNhbGxlciwgY29sbHMgbWFkZSwgY29udGVudCBhY2Nlc3NlZCwgYW5kIHRoZSByYXRpbyBvZiBjb250ZW50IGxpc3RlbmVkIHRvIGNhbGxzIG1hZGUuKioKCioqQmFzZWQgb24gdGhlIGdyYXBocyBiZWxvdywgd2UgYXJlIG5lcnZvdXMgdGhhdCBzb21lIG9mIHRoZSBkYXRhIGlzIG5vdCByYW5kb20gZ2l2ZW4gdGhlIGluY3JlZGlibHkgaGlnaCByYXRpbyBmb3IgY29udGVudCBsaXN0ZW5lZCB0byBjYWxscyBtYWRlLCBidXQgZ2l2ZW4gdGhhdCB0aGUgZGF0YSBpcyBkaXN0cmlidXRlZCBmYWlybHkgZXZlbmx5IGFjcm9zcyB0aGVlIGRpZmZlcmVudCBncmFwaHMsIHdlIGFyZSB1bnN1cmUqKgoKYGBge3J9Cmxhbmdfc3Bva2VuIDwtIGxvZ19kYXRhICU+JQogIGdyb3VwX2J5KGNhbGxlcklkLCBsYW5nSWQpICU+JQogIGNvdW50KCkKCiNEaXN0cmlidXRpb24gb2YgbGFuZ3VhZ2VzIHNwb2tlbgpnZ3Bsb3QoZGF0YT1sYW5nX3Nwb2tlbiwgYWVzKHg9bGFuZ0lkKSkgKwogIGdlb21fYmFyKCkrCiAgbGFicygKICAgIHRpdGxlID0gJ0Rpc3RyaWJ1dGlvbiBvZiBMYW5ndWFnZXMKICAgIDEgPSBBbWhhcmljLCAyPU9yb21pZmZhLCAzPVRpZ3JpZ25hLCA0PVdvbGF5aXR0YSwgYW5kIDU9U2lkYW1pZ25hJywKICAgIHggPSAnTGFuZ3VhZ2UnLAogICAgeT0gJ2NvdW50JwogICkKCgojRGlzdHJpYnV0aW9uIG9mIHRpbWUgZGlmZmVyZW5jZSBiZXd0d2VlbiBmaXJzdCBhbmQgbGFzdCBjYWxsCgpsaWZldGltZTwtIGxvZ19kYXRhICU+JQogIGdyb3VwX2J5KGNhbGxlcklkLCBjYWxsZXJfbGlmZXRpbWUpICU+JQogIGNvdW50KCkKCmdncGxvdChkYXRhPWxpZmV0aW1lLCBhZXMoeD1jYWxsZXJfbGlmZXRpbWUpKSArCiAgZ2VvbV9oaXN0b2dyYW0oZmlsbD0nYnJvd24nLCBjb2xvcj0nYmxhY2snKSsKICBsYWJzKAogICAgdGl0bGUgPSAnRGlzdHJpYnV0aW9uIG9mIENhbGwgTGlmZXRpbWVzJywKICAgIHggPSAnWWVhcnMgYmV0d2VlbiBGaXJzdCBhbmQgTGFzdCBDYWxsJywKICAgIHk9ICdjb3VudCcKICApCgojZGlzdHJpYnV0aW9uIG9mIGNhbGxzIG1hZGUKCmNhbGxzX21hZGUgPC0gbG9nX2RhdGEgJT4lCiAgZ3JvdXBfYnkoY2FsbGVySWQsIG5vQ2FsbHNNYWRlKSAlPiUKICBjb3VudCgpCgpnZ3Bsb3QoY2FsbHNfbWFkZSwgYWVzKHg9bm9DYWxsc01hZGUpKSArCiAgZ2VvbV9oaXN0b2dyYW0oY29sb3I9ImJsYWNrIiwgZmlsbD0iYmx1ZSIpICsKICB4bGltKDAsMzUwKSArCiAgbGFicygKICAgIHRpdGxlID0gJ0Rpc3RyaWJ1dGlvbiBvZiBjYWxscyBtYWRlIHBlciBpbmRpdmlkdWFsIG92ZXIgbGlmZXRpbWUgKE91dGxpZXJzIEV4Y2x1ZGVkKSBcbgpNaW4uIDFzdCBRdS4gIE1lZGlhbiAgTWVhbiAgIDNyZCBRdS4gICAgTWF4LiAKICAgIDMuMCAgICA0NS4wICAgIDY5LjAgICAgIDk5LjkgICAgMTA2LjAgICAgNzExMC4wICcsCiAgICB4ID0gJ1RvdGFsIG51bWJlciBvZiBjYWxscycKICApCgpjb250ZW50X2xpc3RlbmVkIDwtIGZpbHRlcihsb2dfZGF0YSwgZ3JlcGwoIkNPTlRFTlQiLGxvZ0luZm8pKQpjb250ZW50X2xpc3RlbmVkIDwtIGZpbHRlcihjb250ZW50X2xpc3RlbmVkICwgIWdyZXBsKCJDT05URU5UIE1FTlUiLGxvZ0luZm8pKQpjb250ZW50X2xpc3RlbmVkIDwtIGZpbHRlcihjb250ZW50X2xpc3RlbmVkICwgIWdyZXBsKCJDT05URU5UIElTIE5PVCBBVkFJTEFCTEUiLGxvZ0luZm8pKQoKI0NyZWF0aW5nIGEgY29udGVudCNfcGxheWVkIGNvbHVtbgpjb250ZW50X2xpc3RlbmVkJGNvbnRlbnRfcGxheWVkIDwtIGlmZWxzZShzdHJfZGV0ZWN0KGNvbnRlbnRfbGlzdGVuZWQkbG9nSW5mbywgJ0NPTlRFTlQgUExBWUVEJywgbmVnYXRlID0gRkFMU0UpLDEsMCkKY29udGVudF9saXN0ZW5lZCRyZXBsYXlfcmVxdWVzdCA8LSBpZmVsc2Uoc3RyX2RldGVjdChjb250ZW50X2xpc3RlbmVkJGxvZ0luZm8sICdDT05URU5UIFJFUExBWSBSRVFVRVNURUQnLCBuZWdhdGUgPSBGQUxTRSksMSwwKQoKY29udGVudF9wbGF5ZWQ8LWFnZ3JlZ2F0ZShjb250ZW50X2xpc3RlbmVkJGNvbnRlbnRfcGxheWVkLGxpc3QoY29udGVudF9saXN0ZW5lZCRjYWxsZXJJZCksIEZVTj1zdW0pCj9yZW5hbWUKY29udGVudF9wbGF5ZWQgPC0gY29udGVudF9wbGF5ZWQgJT4lIAogIGRwbHlyOjpyZW5hbWUoCiAgICBjb25fcGxheSA9IHgsCiAgICBjYWxsZXJJZCA9IEdyb3VwLjEKICAgICkKCmNvbnRlbnRfcmVwbGF5PC1hZ2dyZWdhdGUoY29udGVudF9saXN0ZW5lZCRyZXBsYXlfcmVxdWVzdCxsaXN0KGNvbnRlbnRfbGlzdGVuZWQkY2FsbGVySWQpLCBGVU49c3VtKQpjb250ZW50X3JlcGxheSA8LSBjb250ZW50X3JlcGxheSAlPiUgCiBkcGx5cjo6cmVuYW1lKAogICAgY29uX3JlcGxheSA9IHgsCiAgICBjYWxsZXJJZCA9IEdyb3VwLjEKICAgICkKCmNvbnRlbnRfY291bnRzIDwtIGNiaW5kKGNvbnRlbnRfcGxheWVkLCBjb250ZW50X3JlcGxheSkKCmNvbnRlbnRfY291bnRzJGFkanVzdGVkX2NvbiA8LSBjb250ZW50X2NvdW50cyRjb25fcGxheS1jb250ZW50X2NvdW50cyRjb25fcmVwbGF5Cgpjb250ZW50X2NvdW50cyRjYWxsZXJJZCA8LSBOVUxMCgpzdW1tYXJ5KGNvbnRlbnRfY291bnRzJGFkanVzdGVkX2NvbikKCgojZ3JhcGhpbmcgdGhlIHRydWUgZGlzdHJpYnV0aW9uIG9mIGNvbnRlbnQgcGxheWVkCmdncGxvdChjb250ZW50X2NvdW50cywgYWVzKHg9YWRqdXN0ZWRfY29uKSkgKwogIGdlb21faGlzdG9ncmFtKGNvbG9yPSJibGFjayIsIGZpbGw9ImdyZWVuIikgKwogIHhsaW0oMCwxMDApICsKICBsYWJzKAogICAgdGl0bGUgPSAnRGlzdHJpYnV0aW9uIG9mIHRvdGFsIENvbnRlbnQgbGlzdGVuZWQgdG8gYWxsIEFjcm9zcyBhbGwgQ2FsbHMgKE91dGxpZXJzIEV4Y2x1ZGVkKSBcbgogICAgICBNaW4uIDFzdCBRdS4gIE1lZGlhbiAgICBNZWFuIDNyZCBRdS4gICAgTWF4LiAKICAgMC4wMCAgICAzLjAwICAgIDguMDAgICAxNy43OSAgIDIwLjAwICAyNzkuMDAgJywKICAgIHggPSAnVG90YWwgQ29udGVudCBMaXN0ZW4gQWNyb3NzIENhbGxzJwogICkKCgojIEdldHRpbmcgdGhlIG51bWJlciBvZiBjYWxscyBwZXIgcGVyc29uCmNhbGxzX21hZGUgPC0gbG9nX2RhdGEgJT4lCiAgZHBseXI6Omdyb3VwX2J5KGNhbGxJZCkgJT4lCiAgY291bnQoKQoKY2FsbHNfbWFkZV9pZCA8LSBsb2dfZGF0YSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoY2FsbElkLCBjYWxsZXJJZCkgJT4lCiAgY291bnQoKQoKCiNqb2luIGJldHdlZW4gdGFibGVzCmNvbnRlbnRfcmF0aW8gPC0gbGVmdF9qb2luKGNhbGxzX21hZGVfaWQsIGNvbnRlbnRfY291bnRzLGJ5PSJjYWxsZXJJZCIpCmNvbnRlbnRfcmF0aW9baXMubmEoY29udGVudF9yYXRpbyldIDwtIDAKCmNvbnRlbnRfcmF0aW8gPC0gY29udGVudF9yYXRpbyAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoY2FsbGVySWQsIGNvbl9wbGF5LCBjb25fcmVwbGF5LCBhZGp1c3RlZF9jb24pICU+JQogIGNvdW50KCkKCmNvbnRlbnRfcmF0aW8kcmF0aW8gPC0gY29udGVudF9yYXRpbyRhZGp1c3RlZF9jb24vY29udGVudF9yYXRpbyRuCgpzdW1tYXJ5KGNvbnRlbnRfcmF0aW8kcmF0aW8pCgpnZ3Bsb3QoY29udGVudF9yYXRpbywgYWVzKHg9cmF0aW8pKSArCiAgZ2VvbV9oaXN0b2dyYW0oY29sb3I9ImJsYWNrIiwgZmlsbD0icmVkIikgKwogIHhsaW0oMCwyKSsKICBsYWJzKAogICAgdGl0bGUgPSAnRGlzdHJpYnV0aW9uIG9mIHJhdGlvIG9mIGNvbnRlbnQgbGlzdGVuZWQgdG8gQ2FsbHMgKE91dGxpZXJzIEV4Y2x1ZGVkKSBcbgpNaW4uIDFzdCBRdS4gIE1lZGlhbiAgICBNZWFuIDNyZCBRdS4gICAgTWF4LiAgICAgCiAwLjAwMDAgIDAuNTYxNCAgMS4wMDAwICAxLjI1MDAgIDEuNTI5MiAxMy40MDAwICcsCiAgICB4ID0gJ0NvbnRlbnQgdG8gQ2FsbCBSYXRpbycKICApCgoKc3VtKGNvbnRlbnRfcmF0aW8kbikKYGBgCgojIyMgVE9QIE1FTlUKCioqTmV4dCwgd2Ugd2FudCB0byBCcmVha2QgZG93biB0aGUgaW5pdGlhbCBNZW51IG9wdGlvbnMgYW5kIGRlbHZlIGludG8gdGhlIGRpc3RyaWJ1dGlvbnMgb2YgdGhlIHNlbGVjdGlvbnMgdGhhdCB0aGUgZmFybWVyIGNhbiBtYWtlIGF0IGEgZGlmZmVyZW50IHN0YXRlIGluIHRoZSBJVlIgU3lzdGVtKioKCioqRm9yIHRoZSBmaXJzdCBhbmFseXNpcywgd2UgbG9va2VkIGF0IHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIFRPUCBNRU5VIGluIHRoZSBkYXRhLiBUaGlzIGNvbWVzIGluIGFzIGZvbGxvd3MqKjoKCiMjIyMjIElOQ09NSU5HIENBTEwgU1RBUlRFRCAtLT4gV0VMQ09NRSBNRVNTQUdFIFBMQVlFRCAtLT4gQVNTSU5HRUQgVE8gRVhQRVJJTUVOVCAoT1BUSU9OQUwpIC0tPiBUT1AgTUVOVQoKKipUT1AgTUVOVSoqCgogLSBSQUlOIE9QVElPTgogLSBISEkgT1BUSU9OIChob3VzZWhvbGQgSXJyaWdhdGlvbikKIC0gUkVTRVQgUFJPRklMRSBPUFRJT04KIC0gVE9QIE1FTlUgUkVQTEFZCiAtIExJVkVTVE9DSyBPUFRJT04gCiAtIENPVklEIE9QVElPTgogCiAqUGxlYXNlIG5vdGUsIHdlIGFyZSB1bnN1cmUgb2YgdGhlIG9yZGVyIHRoZXNlIGFyZSBwcmVzZW50ZWQuIEZvciBvdGhlciBtZW51cywgd2UgZG8gaGF2ZSB0aGUgb3JkZXIqCiAKICoqQmVsb3csIHdlIGhhdmUgdmlzdWFsaXplZCB0aGUgbnVtYmVyIG9mIGZhcm1lcnMsIG91dCBvZiBvdXIgc2FtcGxlLCB0aGF0IGluIHRoZSBsaWZlIHRpbWUgb2YgdGhlaXIgY2FsbGluZyBoaXN0b3J5IGhhdmUgYWNjZXNzZWQgYSBnaXZlbiBUT1AgTUVOVSBpdGVtIGF0IGxlYXN0IG9uY2UqKgogCiAqKkFkZGl0aW9uYWxseSwgd2UgYWxzbyB2aXN1YWxpemVkIHRoaXMgc2FtZSBzZWxlY3Rpb24gZGl2aWRlZCBieSBsYW5ndWFnZSB0byBzZWUgaWYgdGhlIHBhdHRlcm5zIG9mIHNlbGVjaW9udCBhcmUgc2ltaWxhciBvciBkaWZmZXJlbnQgYWNyb3NzIGxhbmdhdWdlcyoqdgogCmBgYHtyfQojU1RBUlRJTkcgSEVSRSBJUyBGT1IgVU5JUVVFIENBTExFUlMKIyBmaWx0ZXJpbmcgb3V0IHRvcCBNZW51IGtleXMKCnRvcF9tZW51IDwtZmlsdGVyKGxvZ19kYXRhLCBncmVwbCgiVE9QIE1FTlUiLGxvZ0luZm8pKQoKI2NsZWFuaW5nIHRoZSBheGlzCnRvcF9tZW51JGxvZ0luZm88LSBzdHJfcmVwbGFjZSh0b3BfbWVudSRsb2dJbmZvLCAiVE9QIE1FTlUgLSAiLCAiIikKdG9wX21lbnUkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHRvcF9tZW51JGxvZ0luZm8sICIgUFJFU1NFRCIsICIiKQp0b3BfbWVudSRsb2dJbmZvPC0gc3RyX3JlcGxhY2UodG9wX21lbnUkbG9nSW5mbywgIiBQUkVTU0VEIiwgIiIpCnRvcF9tZW51JGxvZ0luZm88LSBzdHJfcmVwbGFjZSh0b3BfbWVudSRsb2dJbmZvLCAiIFNFTEVDVEVEIiwgIiIpCgp0b3BfbWVudSA8LSB0b3BfbWVudSAlPiUKICBncm91cF9ieShjYWxsZXJJZCwgbG9nSW5mbywgbGFuZ0lkKSAlPiUKICBjb3VudCgpCgoKZ2dwbG90KHRvcF9tZW51LCBhZXMobG9nSW5mbykpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDMwLCBoanVzdCA9MSkpKwogIGdlb21fYmFyKCkrCiAgbGFicygKICAgIHRpdGxlID0gJ0Rpc3RpcnV0aW9uIG9mIFRPUCBNRU5VIGl0ZW1zIHNlbGVjdGVkIGF0IGxlYXN0IG9uY2UgYnkgYSB1bmlxdWUgY2FsbGVyJywKICAgIHggPSAnVE9QIE1FTlUgb3B0aW9ucycKICApCgpnZ3Bsb3QodG9wX21lbnUsIGFlcyhsYW5nSWQsIGZpbGwgPSBsb2dJbmZvKSkgKwogIGdlb21fYmFyKCkrCiAgbGFicygKICAgIHRpdGxlID0gJ0Rpc3RpcnV0aW9uIG9mIExhbmd1YWdlcyBkaXZpZGVkIGJ5IFRPUCBNRU5VIG9wdGlvbgogICAgMSA9IEFtaGFyaWMsIDI9T3JvbWlmZmEsIDM9VGlncmlnbmEsIDQ9V29sYXlpdHRhLCBhbmQgNT1TaWRhbWlnbmEnLAogICAgeCA9ICdMYW5ndWFnZScKICApCgojU1RBUlRJTkcgSEVSRSBJUyBGT1IgVU5JUVVFIENBTExTCgp0b3BfbWVudV9jYWxsIDwtZmlsdGVyKGxvZ19kYXRhLCBncmVwbCgiVE9QIE1FTlUiLGxvZ0luZm8pKQoKI2NsZWFuaW5nIHRoZSBheGlzCnRvcF9tZW51X2NhbGwkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHRvcF9tZW51X2NhbGwkbG9nSW5mbywgIlRPUCBNRU5VIC0gIiwgIiIpCnRvcF9tZW51X2NhbGwkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHRvcF9tZW51X2NhbGwkbG9nSW5mbywgIiBQUkVTU0VEIiwgIiIpCnRvcF9tZW51X2NhbGwkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHRvcF9tZW51X2NhbGwkbG9nSW5mbywgIiBQUkVTU0VEIiwgIiIpCnRvcF9tZW51X2NhbGwkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHRvcF9tZW51X2NhbGwkbG9nSW5mbywgIiBTRUxFQ1RFRCIsICIiKQoKdG9wX21lbnVfY2FsbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UodG9wX21lbnVfY2FsbCRsb2dJbmZvLCAiUkFJTiBPUFRJT04iLCAiMSAtIFJBSU4gT1BUSU9OIikKdG9wX21lbnVfY2FsbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UodG9wX21lbnVfY2FsbCRsb2dJbmZvLCAiSEhJIE9QVElPTiIsICIyIC0gSEhJIE9QVElPTiIpCnRvcF9tZW51X2NhbGwkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHRvcF9tZW51X2NhbGwkbG9nSW5mbywgIkxJVkVTVE9DSyBPUFRJT04iLCAiMyAtIExJVkVTVE9DSyBPUFRJT04iKQp0b3BfbWVudV9jYWxsJGxvZ0luZm88LSBzdHJfcmVwbGFjZSh0b3BfbWVudV9jYWxsJGxvZ0luZm8sICJDT1ZJRCBPUFRJT04iLCAiNCAtIENPVklEIE9QVElPTiIpCnRvcF9tZW51X2NhbGwkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHRvcF9tZW51X2NhbGwkbG9nSW5mbywgIlJFU0VUIFBST0ZJTEUgT1BUSU9OIiwgIlxcKiAtIFJFU0VUIFBST0ZJTEUiKQp0b3BfbWVudV9jYWxsJGxvZ0luZm88LSBzdHJfcmVwbGFjZSh0b3BfbWVudV9jYWxsJGxvZ0luZm8sICJUT1AgTUVOVSBSRVBMQVlFRCIsICJcXCMgLSBUT1AgTUVOVSBSRVBMQVlFRCIpCgp0b3BfbWVudV9jYWxsIDwtIHRvcF9tZW51X2NhbGwgJT4lCiAgZ3JvdXBfYnkoY2FsbElkLCBsb2dJbmZvKSAlPiUKICBjb3VudCgpCgp0b3BfbWVudV9jYWxsPC0gdG9wX21lbnVfY2FsbFttYXRjaCh1bmlxdWUodG9wX21lbnVfY2FsbCRjYWxsSWQpLCB0b3BfbWVudV9jYWxsJGNhbGxJZCksXQoKZ2dwbG90KHRvcF9tZW51X2NhbGwsIGFlcyh4PWZjdF9pbmZyZXEobG9nSW5mbykpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAyNSwgaGp1c3QgPTEpKSsKICBnZW9tX2Jhcihjb2xvcj0nYmxhY2snLCBmaWxsPSdyZWQnKSsKICBnZW9tX3RleHQoc3RhdD0nY291bnQnLCBhZXMobGFiZWw9Li5jb3VudC4uKSwgdmp1c3Q9LTEpKwogIHlsaW0oMCw2NTAwKSsKICBsYWJzKAogICAgdGl0bGUgPSAnRGlzdGlydXRpb24gb2YgVG9wIE1lbnUgT3B0aW9ucyBTZWxlY3RlZCBwZXIgQ2FsbCB3aXRoIE51bWJlciBQcmVzc2VkIEluZGljYXRlZCcsCiAgICB4ID0gJ1RvcCBNZW51IE9wdGlvbnMnLAogICAgeT0nTnVtYmVyIG9mIENhbGxzJwogICkKdW5pcXVlKHRvcF9tZW51X2NhbGwkY2FsbElkKQpjbGFzcyhsb2dfZGF0YSkKYGBgCiAKIAogCioqQXMgd2UgY2FuIGVhc2lseSBzZWUsIHRoZSBSQUlOIG9wdGlvbnMgYW5kIHRoZSBISEkgb3B0aW9uIGRvbWluYXRlIHRoZSBjaG9pY2VzIGZyb20gdGhlIHRvcCBNZW51LiBTbywgd2UgZGVjaWRlZCB0byBkaXZlIGRlZXBlciBpbnRvIGVhY2ggb2YgdGhlc2UgbWVudXMgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgb3V0bGllciBzZWxlY3Rpb25zIHRoYXQgYXJlIGRlZXAgd2l0aGluIHRoZSBzeXN0ZW0uIEFkZGl0aW9uYWxseSwgdGhzIGRpc3RyaWJ1dGlvbiBhY3Jvc3MgbGFuZ3VhZ2VzIHNlZW1zIHRvIGJlIGZhaXJseSBjb25zaXN0ZW50IGF0IGZhY2UgdmFsdWUuIFdlIGNhbiBydW4gdGVzdHMgaW4gdGhlIGZ1dHVyZSwgYnV0IGZvciBFREEgdGhpcyB3aWxsIGJlIGFkZXF1YXRlLiBGb3IgMy80IGxhbmdhdWdlIG9wdGlvbnMgLSBoYXZpbmcgbW9yZSBkYXRhIHdvdWxkIGJlIGFwcHJlY2FpdGVkKioKCgojIyMgUkFJTiBNRU5VCgojIyMjIyBJTkNPTUlORyBDQUxMIFNUQVJURUQgLS0+IFdFTENPTUUgTUVTU0FHRSBQTEFZRUQgLS0+IFJBTkRPTSBFWFBFUklNRU5UIC0tPiBUT1AgTUVOVSAtLT4gUkFJTiBNRU5VCgoqKkhlcmUsIHdlIGxvb2sgYXQgdGhlIGJyZWFrZG93biBvZiBpbmRpdmlkdWFscyB3aG8gaGF2ZSBzZWxlY3RlZCBhIGdpdmVuIG9wdGlvbiBpbiB0aGUgcmFpbiBtZW51IGF0IGxlYXN0IG9uY2UuIEluIHRoZSBkYXRhLCBNQUlOIE1FTlUgPT0gUkFJTiBNRU5VLioqCgoKKipSQUlOIE1FTlUqKgoKIC0gUFJFIFBMQU5USU5HIE9QVElPTgogLSBQTEFOVElORyBPUFRJT04KIC0gQ1JPUCBQUk9URUNUSU9OIE9QVElPTgogLSBGRVJUSUxJWkdFUiBTSURFIERSRUVTU0lORwogLSBQT1NUIEhBUlZFU1QgQU5EIFBST0NFU1NJTkcKIC0gUkVQRUFUIFJBSU4gTUVOVQogLSBSRVRVUk4gVE8gVE9QIE1FTlUKIC0gSU5WQUxJRCBLRVkgUFJFU1NFRCAoQURESVRJT05BTCBPVVRDT01FKQoKCgpgYGB7cn0KIyBQdWxsaW5nIG91dCB0aGUgcmFpbiBNZW51IEJ5IENBTExMRVIKCiNSQUlOID09IEhISV9SQUlOCnJhaW5fbWVudSA8LSBmaWx0ZXIobG9nX2RhdGEsIGdyZXBsKCJNQUlOIE1FTlUgLSAiLGxvZ0luZm8pKQpyYWluX21lbnUgPC0gZmlsdGVyKHJhaW5fbWVudSwgIWdyZXBsKCJMSVZFU1RPQ0sgTUFJTiBNRU5VIixsb2dJbmZvKSkKcmFpbl9tZW51IDwtIGZpbHRlcihyYWluX21lbnUsICFncmVwbCgiSEhJIE1BSU4gTUVOVSIsbG9nSW5mbykpCnJhaW5fbWVudSA8LSBmaWx0ZXIocmFpbl9tZW51LCAhZ3JlcGwoIkNPVklELTE5IE1BSU4gTUVOVSIsbG9nSW5mbykpCgojZ3JvdXBpbmcgdGhlIG9ic2VydmF0aW9ucwpyYWluX21lbnUgPC1yYWluX21lbnUgJT4lCiAgZ3JvdXBfYnkoY2FsbGVySWQsIGxvZ0luZm8sIGxhbmdJZCkgJT4lCiAgY291bnQoKQoKcmFpbl9tZW51JGxvZ0luZm88LSBzdHJfcmVwbGFjZShyYWluX21lbnUkbG9nSW5mbywgIk1BSU4gTUVOVSAtICIsICIiKQpyYWluX21lbnUkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHJhaW5fbWVudSRsb2dJbmZvLCAiIFNFTEVDVEVEIiwgIiIpCnJhaW5fbWVudSRsb2dJbmZvPC0gc3RyX3JlcGxhY2UocmFpbl9tZW51JGxvZ0luZm8sICIgUFJFU1NFRCIsICIiKQpyYWluX21lbnUkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHJhaW5fbWVudSRsb2dJbmZvLCAiIE9QVElPTiIsICIiKQoKI3Bsb3R0aW5nIHJhaW4gbWVudSBicmVha2Rvd24KZ2dwbG90KGRhdGE9cmFpbl9tZW51LCBhZXMoeD1sb2dJbmZvKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzAsIGhqdXN0ID0xKSkrCiAgZ2VvbV9iYXIoZmlsbD0nYmx1ZScpKwogIGxhYnMoCiAgICB0aXRsZSA9ICdCcmVha2Rvd24gZm9yIEluZGl2aWR1YWxzIEJ5IENvbnRlbnQgU2VsZWN0ZWQgYXQgbGVhc3QgT25jZSBmcm9tIHRoZSByYWluIG1lbnUnLAogICAgeCA9ICdDb250ZW50IFNlbGVjdGVkJywKICAgIHk9ICdjb3VudCcKICApCgoKCiNET0lORyBJVCBCWSBDQUxMISEhIQpyYWluX21lbnVfY2FsbCA8LSBmaWx0ZXIobG9nX2RhdGEsIGdyZXBsKCJNQUlOIE1FTlUgLSAiLGxvZ0luZm8pKQpyYWluX21lbnVfY2FsbCA8LSBmaWx0ZXIocmFpbl9tZW51X2NhbGwsICFncmVwbCgiTElWRVNUT0NLIE1BSU4gTUVOVSIsbG9nSW5mbykpCnJhaW5fbWVudV9jYWxsIDwtIGZpbHRlcihyYWluX21lbnVfY2FsbCwgIWdyZXBsKCJISEkgTUFJTiBNRU5VIixsb2dJbmZvKSkKcmFpbl9tZW51X2NhbGwgPC0gZmlsdGVyKHJhaW5fbWVudV9jYWxsLCAhZ3JlcGwoIkNPVklELTE5IE1BSU4gTUVOVSIsbG9nSW5mbykpCgojZ3JvdXBpbmcgdGhlIG9ic2VydmF0aW9ucwpyYWluX21lbnVfY2FsbDwtcmFpbl9tZW51X2NhbGwgJT4lCiAgZ3JvdXBfYnkoY2FsbElkLCBsb2dJbmZvLCkgJT4lCiAgY291bnQoKQoKcmFpbl9tZW51X2NhbGw8LSByYWluX21lbnVfY2FsbFttYXRjaCh1bmlxdWUocmFpbl9tZW51X2NhbGwkY2FsbElkKSwgcmFpbl9tZW51X2NhbGwkY2FsbElkKSxdCgpyYWluX21lbnVfY2FsbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UocmFpbl9tZW51X2NhbGwkbG9nSW5mbywgIk1BSU4gTUVOVSAtICIsICIiKQpyYWluX21lbnVfY2FsbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UocmFpbl9tZW51X2NhbGwkbG9nSW5mbywgIiBTRUxFQ1RFRCIsICIiKQpyYWluX21lbnVfY2FsbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UocmFpbl9tZW51X2NhbGwkbG9nSW5mbywgIiBQUkVTU0VEIiwgIiIpCnJhaW5fbWVudV9jYWxsJGxvZ0luZm88LSBzdHJfcmVwbGFjZShyYWluX21lbnVfY2FsbCRsb2dJbmZvLCAiIE9QVElPTiIsICIiKQoKCiNGSXhpbmcgdGhlIEhISSBtZW51IGFuZCBhZGRpbmcgbnVtYmVlcnMKcmFpbl9tZW51X2NhbGwkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHJhaW5fbWVudV9jYWxsJGxvZ0luZm8sICJQUkUgUExBTlRJTkciLCAiMSAtIFBSRVBMWk5USU5HIikKcmFpbl9tZW51X2NhbGwkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHJhaW5fbWVudV9jYWxsJGxvZ0luZm8sICJQTEFOVElORyIsICIyIC0gUExBTlRJTkciKQpyYWluX21lbnVfY2FsbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UocmFpbl9tZW51X2NhbGwkbG9nSW5mbywgIjEgLSBQUkVQTFpOVElORyIsICIxIC0gUFJFUExBTlRJTkciKQpyYWluX21lbnVfY2FsbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UocmFpbl9tZW51X2NhbGwkbG9nSW5mbywgIkNST1AgUFJPVEVDVElPTiIsICIzIC0gQ1JPUCBQUk9URUNUSU9OIikKcmFpbl9tZW51X2NhbGwkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHJhaW5fbWVudV9jYWxsJGxvZ0luZm8sICJGRVJUSUxJWkVSIFNJREUgRFJFU1NJTkciLCAiNCAtIEZFUlRJTElaRVIgRFJFU1NJTkciKQpyYWluX21lbnVfY2FsbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UocmFpbl9tZW51X2NhbGwkbG9nSW5mbywgIlBPU1QgSEFSVkVTVCBBTkQgUFJPQ0VTU0lORyIsICI1IC0gUE9TVCBIQVJWRVNUL1BST0NFU1NJTkciKQpyYWluX21lbnVfY2FsbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UocmFpbl9tZW51X2NhbGwkbG9nSW5mbywgIkdPIFRPIE1BSU4gTUVOVSIsICIqIC0gR08gVE8gTUFJTiBNRU5VIikKcmFpbl9tZW51X2NhbGwkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHJhaW5fbWVudV9jYWxsJGxvZ0luZm8sICJNQUlOIE1FTlUgUkVQTEFZRUQiLCAiIyAtIE1BSU4gTUVOVSBSRVBMQVlFRCIpCgojcGxvdHRpbmcgcmFpbiBtZW51IGJyZWFrZG93bgpnZ3Bsb3QoZGF0YT1yYWluX21lbnVfY2FsbCwgYWVzKHg9ZmN0X2luZnJlcShsb2dJbmZvKSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDI1LCBoanVzdCA9MSkpKwogIGdlb21fYmFyKGNvbG9yPSdibGFjaycsIGZpbGw9J2JsdWUnLHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoIDAuMykpKwogIGdlb21fdGV4dChzdGF0PSdjb3VudCcsIGFlcyhsYWJlbD0uLmNvdW50Li4pLCB2anVzdD0tMSkrCiAgeWxpbSgwLDMyNTApKwogIGxhYnMoCiAgICB0aXRsZSA9ICdEaXN0aXJ1dGlvbiBvZiBSYWluIE1lbnUgT3B0aW9ucyBTZWxlY3RlZCBwZXIgQ2FsbCcsCiAgICB4ID0gJ1JhaW4gTWVudSBPcHRpb25zJywKICAgIHk9J051bWJlciBvZiBDYWxscycKICApCgojR0VUVElORyBISEkgTUVOVSBQRVIgQ0FMTApISElfbWVudV9jYWxsIDwtIGZpbHRlcihsb2dfZGF0YSwgZ3JlcGwoIkhISSBNQUlOIE1FTlUgLSAiLGxvZ0luZm8pKQoKI2dyb3VwaW5nIHRoZSBvYnNlcnZhdGlvbnMKSEhJX21lbnVfY2FsbDwtSEhJX21lbnVfY2FsbCAlPiUKICBncm91cF9ieShjYWxsSWQsIGxvZ0luZm8sKSAlPiUKICBjb3VudCgpCgpISElfbWVudV9jYWxsPC0gSEhJX21lbnVfY2FsbFttYXRjaCh1bmlxdWUoSEhJX21lbnVfY2FsbCRjYWxsSWQpLCBISElfbWVudV9jYWxsJGNhbGxJZCksXQoKSEhJX21lbnVfY2FsbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoSEhJX21lbnVfY2FsbCRsb2dJbmZvLCAiSEhJIE1BSU4gTUVOVSAtICIsICIiKQpISElfbWVudV9jYWxsJGxvZ0luZm88LSBzdHJfcmVwbGFjZShISElfbWVudV9jYWxsJGxvZ0luZm8sICIgU0VMRUNURUQiLCAiIikKSEhJX21lbnVfY2FsbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoSEhJX21lbnVfY2FsbCRsb2dJbmZvLCAiIFBSRVNTRUQiLCAiIikKSEhJX21lbnVfY2FsbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoSEhJX21lbnVfY2FsbCRsb2dJbmZvLCAiIE9QVElPTiIsICIiKQoKCiNGSXhpbmcgdGhlIEhISSBtZW51IGFuZCBhZGRpbmcgbnVtYmVlcnMKSEhJX21lbnVfY2FsbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoSEhJX21lbnVfY2FsbCRsb2dJbmZvLCAiUFJFIFBMQU5USU5HIiwgIjEgLSBQUkVQTEFOVElORyIpCkhISV9tZW51X2NhbGwkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKEhISV9tZW51X2NhbGwkbG9nSW5mbywgIlBMQU5USU5HIEFORCBUUkFOU1BMQU5USU5HIiwgIjIgLSBQTEFOVElORy9UUkFOU1BMQU5USU5HIikKSEhJX21lbnVfY2FsbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoSEhJX21lbnVfY2FsbCRsb2dJbmZvLCAiSEFSUk9XSU5HIEFORCBFQVJUSE5JTkciLCAiMyAtIEhBUlJPV0lORy9FQVJUSE5JTkciKQpISElfbWVudV9jYWxsJGxvZ0luZm88LSBzdHJfcmVwbGFjZShISElfbWVudV9jYWxsJGxvZ0luZm8sICJJUlJJR0FUSU5HIENST1BTIiwgIjQgLSBJUlJJR0FUSU5HIENST1BTIikKSEhJX21lbnVfY2FsbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoSEhJX21lbnVfY2FsbCRsb2dJbmZvLCAiUFJPVEVDVElORyBDUk9QUyIsICI1IC0gUFJPVEVDVElORyBDUk9QUyIpCkhISV9tZW51X2NhbGwkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKEhISV9tZW51X2NhbGwkbG9nSW5mbywgIkFQUExZSU5HIEZFUlRJTElaRVIiLCAiNiAtIEFQUExZSU5HIEZFUlRJTElaRVIiKQpISElfbWVudV9jYWxsJGxvZ0luZm88LSBzdHJfcmVwbGFjZShISElfbWVudV9jYWxsJGxvZ0luZm8sICJIQVJWRVNUSU5HIEFORCBQUk9DRVNTSU5HIiwgIjcgLSBIQVJWRVNUSU5HL1BST0NFU1NJTkciKQpISElfbWVudV9jYWxsJGxvZ0luZm88LSBzdHJfcmVwbGFjZShISElfbWVudV9jYWxsJGxvZ0luZm8sICJHTyBUTyBNQUlOIE1FTlUiLCAiKiAtIEdPIFRPIE1BSU4gTUVOVSIpCkhISV9tZW51X2NhbGwkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKEhISV9tZW51X2NhbGwkbG9nSW5mbywgIkhISSBNQUlOIE1FTlUgUkVQTEFZRUQiLCAiIyAtIEhISSBNQUlOIE1FTlUgUkVQTEFZRUQiKQoKCiNwbG90dGluZyByYWluIG1lbnUgYnJlYWtkb3duCmdncGxvdChkYXRhPUhISV9tZW51X2NhbGwsIGFlcyh4PWZjdF9pbmZyZXEobG9nSW5mbykpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMCwgaGp1c3QgPTEpKSsKICBnZW9tX2Jhcihjb2xvcj0nYmxhY2snLCBmaWxsPSdncmVlbicscG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSggMC4zKSkrCiAgZ2VvbV90ZXh0KHN0YXQ9J2NvdW50JywgYWVzKGxhYmVsPS4uY291bnQuLiksIHZqdXN0PS0xKSsKICB5bGltKDAsMTMwMCkrCiAgbGFicygKICAgIHRpdGxlID0gJ0Rpc3RpcnV0aW9uIG9mIEhISSBNZW51IE9wdGlvbnMgU2VsZWN0ZWQgcGVyIENhbGwnLAogICAgeCA9ICdISEkgTWVudSBPcHRpb25zJywKICAgIHk9J051bWJlciBvZiBDYWxscycKICApCgpgYGAKCgoKKipXZSBjYW4gc2VlIHRoYXQgdGhlIHByZS1wbGFudGluZyBtZW51LCB3aGljaCBzdGlsbCBoYXMgb3ZlciA3NSUgb2YgdW5pcXVlIHVzZXJzIGFjY2Vzc3MgaXQgYXQgbGVhc3Qgb25jZSBleHBlcmVpbmNlcyBpbmNyZWRpYmx5IGhpZ2ggdXNhZ2UuIFNvLCB3ZSBub3cgZGl2ZSBpbnRvIHRoaXMgbWVudS4gV2Ugd2lsbCBicmVha2Rvd24gY29uZW50IHNlbGVjdGlvbiBieSBsYW5ndWFnZSBhbmQgb3ZlcmFsbCoqCgoKIyMjIFJBSU4gTUVOVS9QUkUgUExBTlRJTkcgTUVOVQoKIyMjIyMgSU5DT01JTkcgQ0FMTCBTVEFSVEVEIC0tPiBXRUxDT01FIE1FU1NBR0UgUExBWUVEIC0tPiBSQU5ET00gRVhQRVJJTUVOVCAtLT4gCiMjIyMjIFRPUCBNRU5VIC0tPiBSQUlOIE1FTlUgLS0+IFBSRSBQTEFOVElORyBNRU5VCgoqKlBsZWFzZSBub3RlLCB0aGUgcHJlIHBsYW50aW5nIG1lbnUgdW5kZXIgdGhlIHJhaW4gbWVudSBpcyByZWZlcnJlZCB0byBhcyBNRU5VIDEgaW4gdGhlIGRhdGEqKgoKCioqUFJFIFBMQU5USU5HIE1FTlUqKgoKIC0gTEFORCBQUkVQQVJBVElPTgogLSBTRUVEIFZBUklFVFkKIC0gUkVQRUFUIE1FTlUKIC0gR08gVE8gTUFJTiBNRU5VIChSQUlOIE1FTlUpCiAtIElOVkFMSUQgS0VZIChBRERJVElPTkFMIE9VVENPTUUpCiAKIApgYGB7cn0KCgojZmlsdGVyaW5nIG91dCBNRU5VIDEgb3B0aW9ucyBhcyB0aGUgcHJlIHBsYW50aW5nCk1FTlVfMSA8LSBmaWx0ZXIobG9nX2RhdGEsIGdyZXBsKCJNRU5VIDEiLGxvZ0luZm8pKQpNRU5VXzEgPC0gZmlsdGVyKE1FTlVfMSwgIWdyZXBsKCJISElNRU5VIDEiLGxvZ0luZm8pKQpNRU5VXzEgPC0gZmlsdGVyKE1FTlVfMSwgIWdyZXBsKCJBUElDVUxUVVJFIE1FTlUiLGxvZ0luZm8pKQpNRU5VXzEgPC0gZmlsdGVyKE1FTlVfMSwgIWdyZXBsKCJBUElDVUxUVVJFIFNVQjQgTUVOVSIsbG9nSW5mbykpCk1FTlVfMSA8LSBmaWx0ZXIoTUVOVV8xLCAhZ3JlcGwoIkRBSVJZIE1FTlUiLGxvZ0luZm8pKQpNRU5VXzEgPC0gZmlsdGVyKE1FTlVfMSwgIWdyZXBsKCJTTUFMTC1TQ0FMRSBTVUI1IE1FTlUiLGxvZ0luZm8pKQpNRU5VXzEgPC0gZmlsdGVyKE1FTlVfMSwgIWdyZXBsKCJEQUlSWSBTVUIyIE1FTlUiLGxvZ0luZm8pKQpNRU5VXzEgPC0gZmlsdGVyKE1FTlVfMSwgIWdyZXBsKCJGQVRURU5JTkcgTUFOVSIsbG9nSW5mbykpCgpNRU5VXzEgPC0gZmlsdGVyKE1FTlVfMSwgIWdyZXBsKCJGQVRURU5JTkcgU1VCMSBNRU5VIixsb2dJbmZvKSkKTUVOVV8xIDwtIGZpbHRlcihNRU5VXzEsICFncmVwbCgiRkFUVEVOSU5HIFNVQjIgTUVOVSIsbG9nSW5mbykpCk1FTlVfMSA8LSBmaWx0ZXIoTUVOVV8xLCAhZ3JlcGwoIkhPVVNFSE9MRCBNRU5VIixsb2dJbmZvKSkKTUVOVV8xIDwtIGZpbHRlcihNRU5VXzEsICFncmVwbCgiSE9VU0VIT0xEIFNVQjEgTUVOVSAiLGxvZ0luZm8pKQoKCk1FTlVfMSA8LSBNRU5VXzEgJT4lCiAgZ3JvdXBfYnkoY2FsbGVySWQsIGxvZ0luZm8sIGxhbmdJZCkgJT4lCiAgY291bnQoKQoKTUVOVV8xJGxvZ0luZm88LSBzdHJfcmVwbGFjZShNRU5VXzEkbG9nSW5mbywgIk1FTlUgMSAtICIsICIiKQpNRU5VXzEkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKE1FTlVfMSRsb2dJbmZvLCAiIFBSRVNTRUQiLCAiIikKTUVOVV8xJGxvZ0luZm88LSBzdHJfcmVwbGFjZShNRU5VXzEkbG9nSW5mbywgIiBTRUxFQ1RFRCIsICIiKQoKIyBwbG90dGluZwpnZ3Bsb3QoZGF0YT1NRU5VXzEsIGFlcyh4PWxvZ0luZm8pKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAyNSwgaGp1c3Q9IDEpKSsKICBnZW9tX2JhcihmaWxsPSdjeWFuJykrCiAgbGFicygKICAgIHRpdGxlID0gJ0luZGl2aWR1YWxzIEJ5IENvbnRlbnQgU2VsZWN0ZWQgYXQgbGVhc3QgT25jZSBmcm9tIAogICAgUkFJTiBNRU5VL1BSRSBQTEFOVElORyBPUFRJT04nLAogICAgeCA9ICdDb250ZW50IFNlbGVjdGVkJywKICAgIHk9ICdjb3VudCcKICApCgoKCmBgYAoKCiMjIyBSQUlOIE1FTlUvUFJFIFBMQU5USU5HIE1FTlUvTEFORCBQUkVQQVJBVElPTgoKCioqV2UgY29udGludWUgb3VyIHBhdHRlcm4gb2YgZm9sbG93aW5nIHRoZSBtb3N0IGFjY2Vzc2VkIHN1Ym1lbnUgZnJvbSB0aGUgcHJldmlvdXMgc3VibWVudCAtIGxhbmQgcHJlcGFyYXRpb24hIFRoaXMgaXMgYWxzbyB0aGUgYm90dG9tIG9mIGEgdHJlZS4gV2Ugd2lsbCBicmVha2Rvd24gY29uZW50IHNlbGVjdGlvbiBieSBsYW5ndWFnZSBhbmQgb3ZlcmFsbCoqCgoKIyMjIyMgSU5DT01JTkcgQ0FMTCBTVEFSVEVEIC0tPiBXRUxDT01FIE1FU1NBR0UgUExBWUVEIC0tPiBSQU5ET00gRVhQRVJJTUVOVCAtLT4gCiMjIyMjIFRPUCBNRU5VIC0tPiBSQUlOIE1FTlUgLS0+IFBSRSBQTEFOVElORyBNRU5VIC0tPiBMQU5EIFBSRVBBUkFUSU9OCgoqKkxBTkQgUFJFUEFSQVRJT04qKgoKIC0gQkFSTEVZCiAtIE1BSVpFCiAtIFNPUkdIVU0KIC0gVEVGCiAtIFdIRUFUCiAtIFNFU0FNRQogLSBGQVZBIEJFQU4KIC0gQ0hJQ0tQRUEKIC0gQ09NTU9OIEJFQU4KIC0gQ09UVE9OCgpPUkRFUiBVTktPV046CgogLSBSSUNFCiAtIERVUkFNRSBXSEVBVAogLSBMRU5USUwKIC0gTUFMVCBCQVJMRVkKIAogCmBgYHtyfQojR0VUVElORyBUSEUgQ1JPUCBNRU5VIEZST00gTUVOVSAxIChyYWluL3ByZXBsYW50aW5nL2xhbmQgcHJlcGFyYXRpb24gc3ViIG1lbnUpCmxhbmRfcHJlcCA8LSBmaWx0ZXIobG9nX2RhdGEsIGdyZXBsKCJDT05URU5UIFBMQVlFRCAtIExBTkQgUFJFUEFSQVRJT04gLSAiLGxvZ0luZm8pKQoKbGFuZF9wcmVwX2ZpbmFsIDwtIGxhbmRfcHJlcCAlPiUKICBncm91cF9ieShjYWxsZXJJZCwgbG9nSW5mbywgbGFuZ0lkKSAlPiUKICBjb3VudCgpCgpsYW5kX3ByZXBfZmluYWwkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGxhbmRfcHJlcF9maW5hbCRsb2dJbmZvLCAiQ09OVEVOVCBQTEFZRUQgLSBMQU5EIFBSRVBBUkFUSU9OIC0iLCAiIikKCmdncGxvdChkYXRhPWxhbmRfcHJlcF9maW5hbCwgYWVzKHg9bG9nSW5mbykpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdD0yKSkrCiAgZ2VvbV9iYXIoKSsKICBsYWJzKAogICAgdGl0bGUgPSAnUkFJTiBNRU5VL1BSRSBQTEFOVElORy9MQU5EIFBSRVBBUkFUSU9OCiAgICBjb250ZW50IGFjdHVhbGx5IHBsYXllZCBieSBsYW5ndWFnZScsCiAgICB4ID0gJ0NvbnRlbnQgUGxheWVkJywKICAgIHk9ICdjb3VudCcKICApCgoKI2dldCByaWQgb2YgdGhlIGxhbmd1YWdlIGJyZWFrZG93bgpsYW5kX3ByZXBfbm9fbGFuZyA8LSBsYW5kX3ByZXBfZmluYWwKCmxhbmRfcHJlcF9ub19sYW5nJGxvZ0luZm88LSBzdHJfcmVwbGFjZShsYW5kX3ByZXBfbm9fbGFuZyRsb2dJbmZvLCAiLSBBTUhBUklDIiwgIiIpCmxhbmRfcHJlcF9ub19sYW5nJGxvZ0luZm88LSBzdHJfcmVwbGFjZShsYW5kX3ByZXBfbm9fbGFuZyRsb2dJbmZvLCAiLSBPUk9NSUZGQSIsICIiKQpsYW5kX3ByZXBfbm9fbGFuZyRsb2dJbmZvPC0gc3RyX3JlcGxhY2UobGFuZF9wcmVwX25vX2xhbmckbG9nSW5mbywgIi0gVElHUklHTkEiLCAiIikKbGFuZF9wcmVwX25vX2xhbmckbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGxhbmRfcHJlcF9ub19sYW5nJGxvZ0luZm8sICItIFdPTEFZSVRUQSIsICIiKQpsYW5kX3ByZXBfbm9fbGFuZyRsb2dJbmZvPC0gc3RyX3JlcGxhY2UobGFuZF9wcmVwX25vX2xhbmckbG9nSW5mbywgIi0gV09MQVlUSUdOQSIsICIiKQpsYW5kX3ByZXBfbm9fbGFuZyRsb2dJbmZvPC0gc3RyX3JlcGxhY2UobGFuZF9wcmVwX25vX2xhbmckbG9nSW5mbywgIi0gU0lEQU1JR05BIiwgIiIpCgpnZ3Bsb3QobGFuZF9wcmVwX25vX2xhbmcsIGFlcyh4PWxvZ0luZm8pKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpKwogIGdlb21fYmFyKCkrCiAgbGFicygKICAgIHRpdGxlID0gJ1JBSU4gTUVOVS9QUkUgUExBTlRJTkcvTEFORCBQUkVQQVJBVElPTgogICAgY29udGVudCBwbGF5ZWQgb3ZlcmFsbCcsCiAgICB4ID0gJ0NvbnRlbnQgUGxheWVkJywKICAgIHk9ICdjb3VudCcKICApCgpnZ3Bsb3QobGFuZF9wcmVwX25vX2xhbmcsIGFlcyhsYW5nSWQsIGZpbGwgPSBsb2dJbmZvKSkgKwogIGdlb21fYmFyKCkrCiAgbGFicygKICAgIHRpdGxlID0gJ0FMVEVSTkFUSVZFIFJBSU4gTUVOVS9QUkUgUExBTlRJTkcvTEFORCBQUkVQQVJBVElPTgogICAgY29udGVudCBhY3R1YWxseSBwbGF5ZWQgYnkgbGFuZ3VhZ2UKICAgIDEgPSBBbWhhcmljLCAyPU9yb21pZmZhLCAzPVRpZ3JpZ25hLCA0PVdvbGF5aXR0YSwgYW5kIDU9U2lkYW1pZ25hCiAgICAnLAogICAgeCA9ICdMYW5ndWFnZScKICApCmBgYAogCgoqKkJJRyBUQUtFQVdBWTogMzUlIG9mIHVzZXJzIGVuZCB1cCBhY2Nlc3NpbmcgdGhlIG1haXplIG1lbnUgYXQgc29tZSBwb2ludCEgV2hlYXQsIFRlZiwgU29yZ2h1bSwgYW5kIEJhcmxleSBhbHNvIGFwcGVhciB0byBiZSBxdWFsaXRhdGl2ZWx5IHNpZ25pZmljYW50KioKCioqVGhlcmUgaXMgbm8gbWVudSB0byBnbyBkZWVwZXIgaW4sIHNvIGxldCdzIGdvIGJhY2sgdXAgYSBsZXZlbCBhbmQgY2hlY2sgdG8gc2VlIGlmIG90aGVyIGJyYW5jaGVzIGhhdmUgYSBsb3Qgb2YgYWNjZXNzKioKCgojIyMgUkFJTiBNRU5VL1BSRSBQTEFOVElORyBNRU5VL1NFRUQgVkFSSUVUWQoKCiMjIyMjIElOQ09NSU5HIENBTEwgU1RBUlRFRCAtLT4gV0VMQ09NRSBNRVNTQUdFIFBMQVlFRCAtLT4gUkFORE9NIEVYUEVSSU1FTlQgLS0+IAojIyMjIyBUT1AgTUVOVSAtLT4gUkFJTiBNRU5VIC0tPiBQUkUgUExBTlRJTkcgTUVOVSAtLT4gU0VFRCBWQVJJRVRZCgoqKlNFRUQgVkFSSUVUWSoqCgogLSBCQVJMRVkKIC0gTUFJWkUKIC0gU09SR0hVTQogLSBURUYKIC0gV0hFQVQKIC0gU0VTQU1FCiAtIEZBVkEgQkVBTgogLSBDSElDS1BFQQogLSBDT01NT04gQkVBTgoKYGBge3J9CiNHRVRUSU5HIFRIRSBDUk9QIE1FTlUgRlJPTSBNRU5VIDEgKHJhaW4vcHJlcGxhbnRpbmcvc2VlZCB2YXJpZXR5IHN1YiBtZW51KQpzZWVkX3ZhcmlldHkgPC0gZmlsdGVyKGxvZ19kYXRhLCBncmVwbCgiQ09OVEVOVCBQTEFZRUQgLSBTRUVEIFZBUklUWSIsbG9nSW5mbykpCgpzZWVkX3ZhcmlldHlfZmluYWwgPC0gc2VlZF92YXJpZXR5ICU+JQogIGdyb3VwX2J5KGNhbGxlcklkLCBsb2dJbmZvLCBsYW5nSWQpICU+JQogIGNvdW50KCkKCnNlZWRfdmFyaWV0eV9maW5hbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2Uoc2VlZF92YXJpZXR5X2ZpbmFsJGxvZ0luZm8sICJDT05URU5UIFBMQVlFRCAtIFNFRUQgVkFSSVRZIC0gIiwgIiIpCgpnZ3Bsb3QoZGF0YT1zZWVkX3ZhcmlldHlfZmluYWwsIGFlcyh4PWxvZ0luZm8pKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3Q9MSkpKwogIGdlb21fYmFyKCkrCiAgbGFicygKICAgIHRpdGxlID0gJ1JBSU4gTUVOVS9QUkUgUExBTlRJTkcvU0VFRCBWQVJJRVRZCiAgICBjb250ZW50IGFjdHVhbGx5IHBsYXllZCBieSBsYW5ndWFnZScsCiAgICB4ID0gJ0NvbnRlbnQgU2VsZWN0ZWQnLAogICAgeT0gJ2NvdW50JwogICkKCgojZ2V0IHJpZCBvZiB0aGUgbGFuZ3VhZ2UgYnJlYWtkb3duCnNlZWRfdmFyaWV0eV9ub19sYW5nIDwtIHNlZWRfdmFyaWV0eV9maW5hbAoKc2VlZF92YXJpZXR5X25vX2xhbmckbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHNlZWRfdmFyaWV0eV9ub19sYW5nJGxvZ0luZm8sICItIEFNSEFSSUMiLCAiIikKc2VlZF92YXJpZXR5X25vX2xhbmckbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHNlZWRfdmFyaWV0eV9ub19sYW5nJGxvZ0luZm8sICItIE9ST01JRkZBIiwgIiIpCnNlZWRfdmFyaWV0eV9ub19sYW5nJGxvZ0luZm88LSBzdHJfcmVwbGFjZShzZWVkX3ZhcmlldHlfbm9fbGFuZyRsb2dJbmZvLCAiLSBUSUdSSUdOQSIsICIiKQpzZWVkX3ZhcmlldHlfbm9fbGFuZyRsb2dJbmZvPC0gc3RyX3JlcGxhY2Uoc2VlZF92YXJpZXR5X25vX2xhbmckbG9nSW5mbywgIi0gV09MQVlJVFRBIiwgIiIpCnNlZWRfdmFyaWV0eV9ub19sYW5nJGxvZ0luZm88LSBzdHJfcmVwbGFjZShzZWVkX3ZhcmlldHlfbm9fbGFuZyRsb2dJbmZvLCAiLSBXT0xBWVRJR05BIiwgIiIpCnNlZWRfdmFyaWV0eV9ub19sYW5nJGxvZ0luZm88LSBzdHJfcmVwbGFjZShzZWVkX3ZhcmlldHlfbm9fbGFuZyRsb2dJbmZvLCAiLSBTSURBTUlHTkEiLCAiIikKCiNhbHRlcm5hdGl2ZSB3aXRoIGxhbmdhdWdlIHZpZXcKZ2dwbG90KHNlZWRfdmFyaWV0eV9ub19sYW5nLCBhZXMobGFuZ0lkLCBmaWxsID0gbG9nSW5mbykpICsKICBnZW9tX2JhcigpKwogIGxhYnMoCiAgICB0aXRsZSA9ICdBTFRFUk5BVElWRSBSQUlOIE1FTlUvUFJFIFBMQU5USU5HL1NFRSBWQVJJRVRZCiAgICBjb250ZW50IGFjdHVhbGx5IHBsYXllZCBieSBsYW5ndWFnZQogICAgMSA9IEFtaGFyaWMsIDI9T3JvbWlmZmEsIDM9VGlncmlnbmEsIDQ9V29sYXlpdHRhLCBhbmQgNT1TaWRhbWlnbmEKICAgICcsCiAgICB4ID0gJ0xhbmd1YWdlJwogICkKCiNubyBsYW5ndWFnZSAtIG92ZXJhbGwKZ2dwbG90KHNlZWRfdmFyaWV0eV9ub19sYW5nLCBhZXMoeD1sb2dJbmZvKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzAsIGhqdXN0PTEpKSsKICBnZW9tX2JhcigpKwogIGxhYnMoCiAgICB0aXRsZSA9ICdSQUlOIE1FTlUvUFJFIFBMQU5USU5HL3NlZWQgdmFyaWV0eQogICAgY29udGVudCBhY3R1YWxseSBwbGF5ZWQnLAogICAgeCA9ICdDb250ZW50IFNlbGVjdGVkJywKICAgIHk9ICdjb3VudCcKICApCgoKYGBgCiAKKipXZSBoYXZlIG1vc3RseSBleGhhdXN0ZWQgdGhlIHByZS1wbGFudGluZyBvcHRpb24gbWVudSwgYW5kIGlmIHdlIGdvIGJhY2sgdXAgdG8gdGhlIG9yaWdpbmFsIHJhaW4gbWVudSAoYWthIE1BSU4gTUVOVSksIHdlIGNhbiBzZWUgdGhhdCBwbGFudGluZyBhbHNvIGhhcyBhIGxhcmdlIHBvcnBvcnRpb24gb2YgdXNlcnMgLSBvdmVyIGhhbGYqKgoKCiMjIyBSQUlOIE1FTlUvUExBTlRJTkcgTUVOVQoKCiMjIyMjIElOQ09NSU5HIENBTEwgU1RBUlRFRCAtLT4gV0VMQ09NRSBNRVNTQUdFIFBMQVlFRCAtLT4gUkFORE9NIEVYUEVSSU1FTlQgLS0+IAojIyMjIyBUT1AgTUVOVSAtLT4gUkFJTiBNRU5VIC0tPiBQTEFOVElORyBNRU5VCgoqKlRoZSBwbGFudGluZyBvcHRpb24gYXMgYSBzdWJzZWN0aW9uIG9mIHRoZSByYWluIG9wdGlvbiBpcyBrbm93biBhcyBNRU5VIDIgaW4gdGhlIGRhdGEqKgoKUExBTlRJTkcgTUVOVQoKIC0gU0VFRCBSQVRFCiAtIFNPSUwgREVQVEggUExBTlRJTkcKIC0gVFJBTlNQTEFOVElORwogLSBNT0lTVFVSRSBDT05TRVJWQVRJT04KIC0gRkVSVElMSVpFUiBBUFBMSUNBVElPTgogLSBSRVBMQVkgTUVOWQogLSBSRVRVUk4gVE8gUkFJTiBNRU5ZCiAtIElOVkFMSUQgS0VZIChBRERJVElPTkFMIE9VVENPTUUpCiAKCgpgYGB7cn0KI1BMQU5USU5HIE9QVElPTiAtIHNlY29uZCBtb3N0IGFjY2Vzc2VkIE1FTlUgMgpNRU5VXzIgPC0gZmlsdGVyKGxvZ19kYXRhLCBncmVwbCgiTUVOVSAyIixsb2dJbmZvKSkKTUVOVV8yIDwtIGZpbHRlcihNRU5VXzIsICFncmVwbCgiSEhJTUVOVSAyIixsb2dJbmZvKSkKTUVOVV8yIDwtIGZpbHRlcihNRU5VXzIsICFncmVwbCgiQVBJQ1VMVFVSRSBNRU5VIixsb2dJbmZvKSkKTUVOVV8yIDwtIGZpbHRlcihNRU5VXzIsICFncmVwbCgiQVBJQ1VMVFVSRSBTVUIyIE1FTlUiLGxvZ0luZm8pKQpNRU5VXzIgPC0gZmlsdGVyKE1FTlVfMiwgIWdyZXBsKCJEQUlSWSBNRU5VIixsb2dJbmZvKSkKTUVOVV8yIDwtIGZpbHRlcihNRU5VXzIsICFncmVwbCgiRkFUVEVOSU5HIE1BTlUiLGxvZ0luZm8pKQoKTUVOVV8yIDwtIE1FTlVfMiAlPiUKICBncm91cF9ieShjYWxsZXJJZCwgbG9nSW5mbywgbGFuZ0lkKSAlPiUKICBjb3VudCgpCgojY2xlYW5pbmcKTUVOVV8yJGxvZ0luZm88LSBzdHJfcmVwbGFjZShNRU5VXzIkbG9nSW5mbywgIk1FTlUgMiAtICIsICIiKQpNRU5VXzIkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKE1FTlVfMiRsb2dJbmZvLCAiIFNFTEVDVEVEIiwgIiIpCk1FTlVfMiRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoTUVOVV8yJGxvZ0luZm8sICIgUFJFU1NFRCIsICIiKQpNRU5VXzIkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKE1FTlVfMiRsb2dJbmZvLCAiIE9QVElPTiIsICIiKQoKCiNwbG90dGluZwpnZ3Bsb3QoZGF0YT1NRU5VXzIsIGFlcyh4PWZjdF9pbmZyZXEobG9nSW5mbykpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3Q9MSkpKwogIGdlb21fYmFyKGZpbGw9J29saXZlZHJhYicpKwogIGxhYnMoCiAgICB0aXRsZSA9ICdJbmRpdmlkdWFscyBCeSBDb250ZW50IFNlbGVjdGVkIGF0IGxlYXN0IE9uY2UgZnJvbSAKICAgIFJBSU4gTUVOVS9QTEFOVElORyBPUFRJT04nLAogICAgeCA9ICdDb250ZW50IFNlbGVjdGVkJywKICAgIHk9ICdjb3VudCcKICApCmBgYAoKCgoqKkFzIHBlciB1c3VhbCwgd2Ugd2lsbCBnbyBpbnRvIHRoZSBtb3N0IGNvbW1vbiBzZWxlY3Rpb246IHNlZWQgcmF0ZSEqKgoKIyMjIFJBSU4gTUVOVS9QTEFOVElORyBNRU5VL1NFRUQgUkFURQoKCiMjIyMjIElOQ09NSU5HIENBTEwgU1RBUlRFRCAtLT4gV0VMQ09NRSBNRVNTQUdFIFBMQVlFRCAtLT4gUkFORE9NIEVYUEVSSU1FTlQgLS0+IAojIyMjIyBUT1AgTUVOVSAtLT4gUkFJTiBNRU5VIC0tPiBQTEFOVElORyBNRU5VIC0tPiBTRUVEIFJBVEUKCgoqKlNFRUQgUkFURSoqCgogLSBCQVJMRVkKIC0gTUFJWkUKIC0gU09SR0hVTQogLSBURUYKIC0gV0hFQVQKIC0gU0VTQU1FCiAtIEZBVkEgQkVBTgogLSBDSElDS1BFQQogLSBDT01NT04gQkVBTgogLSBDT1RUT04KCk9SREVSIFVOS09XTjoKCiAtIFJJQ0UKIC0gRFVSQU1FIFdIRUFUCiAtIExFTlRJTAogLSBNQUxUIEJBUkxFWQoKYGBge3J9CnNlZWRfcmF0ZSA8LSBmaWx0ZXIobG9nX2RhdGEsIGdyZXBsKCJDT05URU5UIFBMQVlFRCAtIFNFRUQgUkFURSIsbG9nSW5mbykpCgpzZWVkX3JhdGVfZmluYWwgPC0gc2VlZF9yYXRlICU+JQogIGdyb3VwX2J5KGNhbGxlcklkLCBsb2dJbmZvLCBsYW5nSWQpICU+JQogIGNvdW50KCkKCnNlZWRfcmF0ZV9maW5hbCRsb2dJbmZvPC0gc3RyX3JlcGxhY2Uoc2VlZF9yYXRlX2ZpbmFsJGxvZ0luZm8sICJDT05URU5UIFBMQVlFRCAtIFNFRUQgUkFURSAtIiwgIiIpCgpnZ3Bsb3QoZGF0YT1zZWVkX3JhdGVfZmluYWwsIGFlcyh4PWxvZ0luZm8pKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSxoanVzdD0xKSkrCiAgZ2VvbV9iYXIoKSsKICBsYWJzKAogICAgdGl0bGUgPSAnUkFJTiBNRU5VL1BMQU5USU5HL1NFRUQgUkFURQogICAgY29udGVudCBhY3R1YWxseSBwbGF5ZWQgYnkgbGFuZ3VhZ2UnLAogICAgeCA9ICdDb250ZW50IFNlbGVjdGVkJywKICAgIHk9ICdjb3VudCcKICApCgojZ2V0IHJpZCBvZiB0aGUgbGFuZ3VhZ2UgYnJlYWtkb3duCnNlZWRfcmF0ZV9ub19sYW5nIDwtIHNlZWRfcmF0ZV9maW5hbAoKc2VlZF9yYXRlX25vX2xhbmckbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHNlZWRfcmF0ZV9ub19sYW5nJGxvZ0luZm8sICItIEFNSEFSSUMiLCAiIikKc2VlZF9yYXRlX25vX2xhbmckbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHNlZWRfcmF0ZV9ub19sYW5nJGxvZ0luZm8sICItIE9ST01JRkZBIiwgIiIpCnNlZWRfcmF0ZV9ub19sYW5nJGxvZ0luZm88LSBzdHJfcmVwbGFjZShzZWVkX3JhdGVfbm9fbGFuZyRsb2dJbmZvLCAiLSBUSUdSSUdOQSIsICIiKQpzZWVkX3JhdGVfbm9fbGFuZyRsb2dJbmZvPC0gc3RyX3JlcGxhY2Uoc2VlZF9yYXRlX25vX2xhbmckbG9nSW5mbywgIi0gV09MQVlJVFRBIiwgIiIpCnNlZWRfcmF0ZV9ub19sYW5nJGxvZ0luZm88LSBzdHJfcmVwbGFjZShzZWVkX3JhdGVfbm9fbGFuZyRsb2dJbmZvLCAiLSBXT0xBWVRJR05BIiwgIiIpCnNlZWRfcmF0ZV9ub19sYW5nJGxvZ0luZm88LSBzdHJfcmVwbGFjZShzZWVkX3JhdGVfbm9fbGFuZyRsb2dJbmZvLCAiLSBTSURBTUlHTkEiLCAiIikKCiNhbHRlcm5hdGl2ZSB3aXRoIGxhbmdhdWdlIHZpZXcKZ2dwbG90KHNlZWRfcmF0ZV9ub19sYW5nLCBhZXMobGFuZ0lkLCBmaWxsID0gbG9nSW5mbykpICsKICBnZW9tX2JhcigpKwogIGxhYnMoCiAgICB0aXRsZSA9ICdBTFRFUk5BVElWRSBSQUlOIE1FTlUvUExBTlRJTkcvU0VFRCBSQVRFCiAgICBjb250ZW50IGFjdHVhbGx5IHBsYXllZCBieSBsYW5ndWFnZQogICAgMSA9IEFtaGFyaWMsIDI9T3JvbWlmZmEsIDM9VGlncmlnbmEsIDQ9V29sYXlpdHRhLCBhbmQgNT1TaWRhbWlnbmEKICAgICcsCiAgICB4ID0gJ0xhbmd1YWdlJwogICkKI25vIGxhbmd1YWdlCmdncGxvdChzZWVkX3JhdGVfbm9fbGFuZywgYWVzKHg9bG9nSW5mbykpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdD0xKSkrCiAgZ2VvbV9iYXIoKSsKICBsYWJzKAogICAgdGl0bGUgPSAnUkFJTiBNRU5VL1BMQU5USU5HL1NFRUQgUkFURQogICAgY29udGVudCBhY3R1YWxseSBwbGF5ZWQnLAogICAgeCA9ICdDb250ZW50IFNlbGVjdGVkJywKICAgIHk9ICdjb3VudCcKICApCgpgYGAKCgoKCmBgYHtyfQpjcm9wX21lbnUgPC0gbG9nX2RhdGEgJT4lCiAgZmlsdGVyKGdyZXBsKCJDUk9QIE1FTlUgLSAiLGxvZ0luZm8pKSAlPiUKICBmaWx0ZXIoIWdyZXBsKCJISEkiLGxvZ0luZm8pKSAlPiUKICBmaWx0ZXIoIWdyZXBsKCJSRVBMQVlFRCIsbG9nSW5mbykpCgpjcm9wX21lbnUgPC0gY3JvcF9tZW51ICU+JQogIGdyb3VwX2J5KGNhbGxlcklkLCBsb2dJbmZvLCBsYW5nSWQpICU+JQogIGNvdW50KCkKCmNyb3BfbWVudSRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY3JvcF9tZW51JGxvZ0luZm8sICJDUk9QIE1FTlUgLSAiLCAiIikKY3JvcF9tZW51JGxvZ0luZm88LSBzdHJfcmVwbGFjZShjcm9wX21lbnUkbG9nSW5mbywgIiBTRUxFQ1RFRCIsICIiKQpjcm9wX21lbnUkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNyb3BfbWVudSRsb2dJbmZvLCAiR08gVE8iLCAiIikKCgpnZ3Bsb3QoY3JvcF9tZW51LCBhZXMoeD1sb2dJbmZvKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0xLCBzaXplID0gNykpKwogIGdlb21fYmFyKCkrCiAgbGFicygKICAgIHRpdGxlID0gJ0Nyb3AgbWVudSBicmVha2Rvd24nLAogICAgeCA9ICdDcm9wcycsCiAgICB5PSAnY291bnQnCiAgKQoKZ2dwbG90KGNyb3BfbWVudSwgYWVzKGxhbmdJZCwgZmlsbCA9IGxvZ0luZm8pKSArCiAgZ2VvbV9iYXIoKSsKICBsYWJzKAogICAgdGl0bGUgPSAnQ1JPUCBNRU5VIEJZIExBTkdVQUdFCiAgICAxID0gQW1oYXJpYywgMj1Pcm9taWZmYSwgMz1UaWdyaWduYSwgND1Xb2xheWl0dGEsIGFuZCA1PVNpZGFtaWduYQogICAgJywKICAgIHggPSAnTGFuZ3VhZ2UnCiAgKQpudW1fY3JvcF90eXBlcyA8LSBkYXRhLmZyYW1lKGFzLm51bWVyaWModGFibGUoY3JvcF9tZW51JGNhbGxlcklkKSkpCm51bV9jcm9wX3R5cGVzJGZyZXF1ZW5jaWVzIDwtIG51bV9jcm9wX3R5cGVzJGFzLm51bWVyaWMudGFibGUuY3JvcF9tZW51LmNhbGxlcklkLgoKc3VtbWFyeShudW1fY3JvcF90eXBlcyRmcmVxdWVuY2llcykKCmdncGxvdChudW1fY3JvcF90eXBlcywgYWVzKGZyZXF1ZW5jaWVzKSkgKwogIGdlb21faGlzdG9ncmFtKGNvbG9yPSJibGFjayIsIGZpbGw9InJlZCIpICsKICBsYWJzKAogICAgdGl0bGUgPSAnRGlzdHJpYnV0aW9uIG9mIG51bWJlciBjcm9wcyBldmVyIHNlbGVjdGVkIGJ5IGluZGl2aWR1YWwgXG4KICAgICAgTWluLiAgMXN0IFF1LiAgTWVkaWFuICAgIE1lYW4gICAzcmQgUXUuICAgIE1heC4gCiAgMS4wMDAgICAgIDIuMDAwICAgICA0LjAwMCAgICAgIDQuOTE1ICAgICA3LjAwMCAgICAgMTUuMDAwICcsCiAgICB4ID0gJ051bWJlciBvZiBjcm9wcyBzZWxlY3RlZCAnCiAgKQpgYGAKCgpgYGB7cn0KI0dFVFRJTkcgQk9USCBUSEUgQ1JPUCBNRU5VUyBmb3IgYm90aCByYWluIGFuZCBoaGkKcmFpbl9jcm9wX21lbnUgPC0gZmlsdGVyKGxvZ19kYXRhLCBncmVwbCgiQ1JPUCBNRU5VIC0gIixsb2dJbmZvKSkKcmFpbl9jcm9wX21lbnUgPC0gZmlsdGVyKHJhaW5fY3JvcF9tZW51LCAhZ3JlcGwoIkhISSIsbG9nSW5mbykpCgpyYWluX2Nyb3BfbWVudSRsb2dJbmZvPC0gc3RyX3JlcGxhY2UocmFpbl9jcm9wX21lbnUkbG9nSW5mbywgIkNST1AgTUVOVSAtICIsICIiKQpyYWluX2Nyb3BfbWVudSRsb2dJbmZvPC0gc3RyX3JlcGxhY2UocmFpbl9jcm9wX21lbnUkbG9nSW5mbywgIiBTRUxFQ1RFRCIsICIiKQpyYWluX2Nyb3BfbWVudSRsb2dJbmZvPC0gc3RyX3JlcGxhY2UocmFpbl9jcm9wX21lbnUkbG9nSW5mbywgIiBQVElPTiIsICJPUFRJT04iKQp0YWJsZShyYWluX2Nyb3BfbWVudSRsb2dJbmZvKQoKCiNBRERJTkcgVEhFIE5VTUJFUlMKcmFpbl9jcm9wX21lbnUkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHJhaW5fY3JvcF9tZW51JGxvZ0luZm8sICJCQVJMRVkgT1BUSU9OIiwgIjEgLSBCQVJMRVkgT1BUSU9OIikKcmFpbl9jcm9wX21lbnUkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHJhaW5fY3JvcF9tZW51JGxvZ0luZm8sICJNQUlaRSBPUFRJT04iLCAiMiAtIE1BSVpFIE9QVElPTiIpCnJhaW5fY3JvcF9tZW51JGxvZ0luZm88LSBzdHJfcmVwbGFjZShyYWluX2Nyb3BfbWVudSRsb2dJbmZvLCAiU09SR0hVTSBPUFRJT04iLCAiMyAtIFNPUkdIVU0gT1BUSU9OIikKcmFpbl9jcm9wX21lbnUkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHJhaW5fY3JvcF9tZW51JGxvZ0luZm8sICJURUYgT1BUSU9OIiwgIjQgLSBURUYgT1BUSU9OIikKcmFpbl9jcm9wX21lbnUkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHJhaW5fY3JvcF9tZW51JGxvZ0luZm8sICJXSEVBVCBPUFRJT04iLCAiNSAtIFdIRUFUIE9QVElPTiIpCnJhaW5fY3JvcF9tZW51JGxvZ0luZm88LSBzdHJfcmVwbGFjZShyYWluX2Nyb3BfbWVudSRsb2dJbmZvLCAiU0VTQU1FIE9QVElPTiIsICI2IC0gU0VTQU1FIE9QVElPTiIpCnJhaW5fY3JvcF9tZW51JGxvZ0luZm88LSBzdHJfcmVwbGFjZShyYWluX2Nyb3BfbWVudSRsb2dJbmZvLCAiRkFWQSBCRUFOIE9QVElPTiIsICI3IC0gRkFWQSBCRUFOIE9QVElPTiIpCnJhaW5fY3JvcF9tZW51JGxvZ0luZm88LSBzdHJfcmVwbGFjZShyYWluX2Nyb3BfbWVudSRsb2dJbmZvLCAiQ0hJQ0tQRUEgT1BUSU9OIiwgIjggLSBDSElDS1BFQSBPUFRJT04iKQpyYWluX2Nyb3BfbWVudSRsb2dJbmZvPC0gc3RyX3JlcGxhY2UocmFpbl9jcm9wX21lbnUkbG9nSW5mbywgIkNPTU1PTiBCRUFOT1BUSU9OIiwgIjkgLSBDT01NT04gQkVBTiBPUFRJT04iKQpyYWluX2Nyb3BfbWVudSRsb2dJbmZvPC0gc3RyX3JlcGxhY2UocmFpbl9jcm9wX21lbnUkbG9nSW5mbywgIkNPVFRPTiBPUFRJT04iLCAiMTAgLSBDT1RUT04gT1BUSU9OIikKcmFpbl9jcm9wX21lbnUkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHJhaW5fY3JvcF9tZW51JGxvZ0luZm8sICJDUk9QIE1FTlUgUkVQTEFZRUQiLCAiIyAtIENST1AgTUVOVSBSRVBMQVlFRCIpCnJhaW5fY3JvcF9tZW51JGxvZ0luZm88LSBzdHJfcmVwbGFjZShyYWluX2Nyb3BfbWVudSRsb2dJbmZvLCAiR08gVE8gTUFJTiBNRU5VIE9QVElPTiIsICIqIC0gR08gVE8gTUFJTiBNRU5VIE9QVElPTiIpCgojZml4ZXMKcmFpbl9jcm9wX21lbnUkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHJhaW5fY3JvcF9tZW51JGxvZ0luZm8sICJNQUxUIDEgLSAiLCAiIikKcmFpbl9jcm9wX21lbnUkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHJhaW5fY3JvcF9tZW51JGxvZ0luZm8sICJEVVJFTSA1IC0gIiwgIiIpCgoKCiNwbG90dGluZyByYWluCmdncGxvdChyYWluX2Nyb3BfbWVudSwgYWVzKHg9ZmN0X2luZnJlcShsb2dJbmZvKSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9MSwgc2l6ZSA9IDcpKSsKICBnZW9tX2JhcihmaWxsPSdibGFjaycpKwogIGdlb21fdGV4dChzdGF0PSdjb3VudCcsIGFlcyhsYWJlbD0uLmNvdW50Li4pLCB2anVzdD0tMSkrCiAgeWxpbSgwLDMyMDApKwogIGxhYnMoCiAgICB0aXRsZSA9ICdSYWluIENyb3AgbWVudSBUb3RhbCBTZWxlY3Rpb25zIHdpdGggQnV0dG9uIENob2ljZXMnLAogICAgeCA9ICdDcm9wcycsCiAgICB5PSAnY291bnQnCiAgKQoKCiNnZXR0aW5nIHRoZSBISEkgTUVOVQpoaGlfY3JvcF9tZW51IDwtIGZpbHRlcihsb2dfZGF0YSwgZ3JlcGwoIkhISUNST1AgTUVOVSAtICIsbG9nSW5mbykpCmhoaV9jcm9wX21lbnUkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGhoaV9jcm9wX21lbnUkbG9nSW5mbywgIkhISUNST1AgTUVOVSAtICIsICIiKQpoaGlfY3JvcF9tZW51JGxvZ0luZm88LSBzdHJfcmVwbGFjZShoaGlfY3JvcF9tZW51JGxvZ0luZm8sICIgU0VMRUNURUQiLCAiIikKdGFibGUoaGhpX2Nyb3BfbWVudSRsb2dJbmZvKQoKI0FERElORyBUSEUgTlVNQkVSUwpoaGlfY3JvcF9tZW51JGxvZ0luZm88LSBzdHJfcmVwbGFjZShoaGlfY3JvcF9tZW51JGxvZ0luZm8sICJQT1RBVE8gT1BUSU9OIiwgIjEgLSBQT1RBVE8gT1BUSU9OIikKaGhpX2Nyb3BfbWVudSRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoaGhpX2Nyb3BfbWVudSRsb2dJbmZvLCAiQ0FSUk9UIE9QVElPTiIsICIyIC0gQ0FSUk9UIE9QVElPTiIpCmhoaV9jcm9wX21lbnUkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGhoaV9jcm9wX21lbnUkbG9nSW5mbywgIk9OSU9OIE9QVElPTiIsICIzIC0gT05JT04gT1BUSU9OIikKaGhpX2Nyb3BfbWVudSRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoaGhpX2Nyb3BfbWVudSRsb2dJbmZvLCAiR0FSTElDIE9QVElPTiIsICI0IC0gR0FSTElDIE9QVElPTiIpCmhoaV9jcm9wX21lbnUkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGhoaV9jcm9wX21lbnUkbG9nSW5mbywgIlRPTUFUTyBPUFRJT04iLCAiNSAtIFRPTUFUTyBPUFRJT04iKQpoaGlfY3JvcF9tZW51JGxvZ0luZm88LSBzdHJfcmVwbGFjZShoaGlfY3JvcF9tZW51JGxvZ0luZm8sICJQQVBFUiBPUFRJT04iLCAiNiAtIFBFUFBFUiBPUFRJT04iKQpoaGlfY3JvcF9tZW51JGxvZ0luZm88LSBzdHJfcmVwbGFjZShoaGlfY3JvcF9tZW51JGxvZ0luZm8sICJIRUFEIENBQkJBR0UgT1BUSU9OIiwgIjcgLSBIRUFEIENBQkJBR0UgT1BUSU9OIikKaGhpX2Nyb3BfbWVudSRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoaGhpX2Nyb3BfbWVudSRsb2dJbmZvLCAiQ1JPUCBNRU5VIFJFUExBWUVEIiwgIiMgLSBDUk9QIE1FTlUgUkVQTEFZRUQiKQpoaGlfY3JvcF9tZW51JGxvZ0luZm88LSBzdHJfcmVwbGFjZShoaGlfY3JvcF9tZW51JGxvZ0luZm8sICJHTyBUTyBNQUlOIE1FTlUgT1BUSU9OIiwgIiogLSBHTyBUTyBNQUlOIE1FTlUgT1BUSU9OIikKCiNwbG90dGluZyBISEkKZ2dwbG90KGhoaV9jcm9wX21lbnUsIGFlcyh4PWZjdF9pbmZyZXEobG9nSW5mbykpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPTEsIHNpemUgPSA3KSkrCiAgZ2VvbV9iYXIoZmlsbD0nYnJvd24nKSsKICBnZW9tX3RleHQoc3RhdD0nY291bnQnLCBhZXMobGFiZWw9Li5jb3VudC4uKSwgdmp1c3Q9LTEpKwogIHlsaW0oMCwxNzUwKSsKICBsYWJzKAogICAgdGl0bGUgPSAnSEhJIENyb3AgTWVudSBUb3RhbCBTZWxlY3Rpb25zIHdpdGggQnV0dG9uIENob2ljZXMnLAogICAgeCA9ICdDcm9wcycsCiAgICB5PSAnY291bnQnCiAgKQoKYGBgCgoKYGBge3J9CgojIFRPVEFMIENST1BTIEJZIENPTkVOVCBQTEFZRURFIEVWRVIhISEhCmNvbnRlbnRfY3JvcF9wbGF5ZWQgPC0gZmlsdGVyKGxvZ19kYXRhLCBncmVwbCgiQ09OVEVOVCBQTEFZRUQgLSAiLGxvZ0luZm8pKQpjb250ZW50X2Nyb3BfcGxheWVkIDwtIGZpbHRlcihjb250ZW50X2Nyb3BfcGxheWVkLCAhZ3JlcGwoIkxJVkVTVE9DSyIsbG9nSW5mbykpCmNvbnRlbnRfY3JvcF9wbGF5ZWQgPC0gZmlsdGVyKGNvbnRlbnRfY3JvcF9wbGF5ZWQsICFncmVwbCgiQVBJQ1VMVFVSRSIsbG9nSW5mbykpCmNvbnRlbnRfY3JvcF9wbGF5ZWQgPC0gZmlsdGVyKGNvbnRlbnRfY3JvcF9wbGF5ZWQsICFncmVwbCgiQ09WSUQiLGxvZ0luZm8pKQpjb250ZW50X2Nyb3BfcGxheWVkIDwtIGZpbHRlcihjb250ZW50X2Nyb3BfcGxheWVkLCAhZ3JlcGwoIkRBSVJZIixsb2dJbmZvKSkKY29udGVudF9jcm9wX3BsYXllZCA8LSBmaWx0ZXIoY29udGVudF9jcm9wX3BsYXllZCwgIWdyZXBsKCJGQU1JTFkiLGxvZ0luZm8pKQpjb250ZW50X2Nyb3BfcGxheWVkIDwtIGZpbHRlcihjb250ZW50X2Nyb3BfcGxheWVkLCAhZ3JlcGwoIkNBVFRMRSIsbG9nSW5mbykpCmNvbnRlbnRfY3JvcF9wbGF5ZWQgPC0gZmlsdGVyKGNvbnRlbnRfY3JvcF9wbGF5ZWQsICFncmVwbCgiRkFUVEVOSU5HIixsb2dJbmZvKSkKY29udGVudF9jcm9wX3BsYXllZCA8LSBmaWx0ZXIoY29udGVudF9jcm9wX3BsYXllZCwgIWdyZXBsKCJQT1VMVFJZIixsb2dJbmZvKSkKY29udGVudF9jcm9wX3BsYXllZCA8LSBmaWx0ZXIoY29udGVudF9jcm9wX3BsYXllZCwgIWdyZXBsKCJTQUZFIixsb2dJbmZvKSkKY29udGVudF9jcm9wX3BsYXllZCA8LSBmaWx0ZXIoY29udGVudF9jcm9wX3BsYXllZCwgIWdyZXBsKCJNSVNDT05DRVBUSU9OUyIsbG9nSW5mbykpCgojZ2V0dGluZyByaWQgb2YgdGhlIGxhbmd1YWdlcy9jb250ZW50CmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIi0gQU1IQVJJQyIsICIiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICItIE9ST01JRkZBIiwgIiIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIi0gVElHUklHTkEiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiLSBXT0xBWUlUVEEiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiLSBXT0xBWVRJR05BIiwgIiIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIi0gU0lEQU1JR05BIiwgIiIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIkNPTlRFTlQgUExBWUVEIC0gIiwgIiIpCgojZ2V0dGluZyByaWQgb2YgbWVudSBsYWJlbHMKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiQVBQTFlJTkcgRkVSVElMSVpFUiAtICIsICIiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJESVNFQVNFIENPTlRST0wgLSAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiRkVSVElMSVpFUiBBUFBMSUNBVElPTiBSQVRFIC0gIiwgIiIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIkZFUlRJTElaRVIgU0lERSBEUkVTU0lORyAtICIsICIiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJIQVJST1dJTkcgQU5EIEVBUlRITklORyBVUCAtICIsICIiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJIQVJWRVNUSU5HIC0gIiwgIiIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIkhBUlZFU1RJTkcgVEVDSE5JUVVFIC0gIiwgIiIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIkhPVyBUTyBBREQgV0FURVIgLSAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiSE9XIFRPIFBMQU5UIC0gIiwgIiIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIkhPVyBUTyBTRUxFQ1QgQU5EIEJVWSBTRUVEUyAtICIsICIiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJJTlNFQ1QgQ09OVFJPTCAtICIsICIiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJMQU5EIFBSRVBBUkFUSU9OIC0gIiwgIiIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIk1BTkFHSU5HIFdFRURTIC0gIiwgIiIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIk1PSVNUVVJFIENPTlNFUlZBVElPTiAtICIsICIiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJPUFRJTVVNIFNQQUNJTkcgQkVUV0VFTiBST1dTIEFORCBQTEFOVFMgLSAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiUExPVCBQUkVQQVJBVElPTiAtICIsICIiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJQUkUtSVJSSUdBVElPTiAtICIsICIiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJQUk9DRVNTSU5HIC0gIiwgIiIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIlxcKCIsICIiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJcXCkiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiUFJPQ0VTU0lORyBISEkgLSAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiUFJPVEVDVElPTiBPTiBJTlNFQ1RTIEFORCBESVNFQVNFUyAtICIsICIiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJTRUVEIFJBVEUgLSAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiU0VFRCBWQVJJVFkgLSAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiU0VFRCBWQVJJVFkgLSIsICIiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJTT0lMIERFUFRIIC0gIiwgIiIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIlNPSUwgREVQVEggLSIsICIiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJUSFJFU0hJTkcgQU5EIENMRUFOSU5HIC0gIiwgIiIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIlRSQU5TUExBTlRJTkcgLSAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiV0VFRCBDT05UUk9MIC0gIiwgIiIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIldIRU4gQU5EIEhPVyBNVUNIIFdBVEVSIFRPIEFERCAtIERFR0EgLSBDTEFZIC0gIiwgIiIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIkhFTiBBTkQgSE9XIE1VQ0ggV0FURVIgVE8gQUREIC0gREVHQSAtIExPQU0gLSAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiV0hFTiBBTkQgSE9XIE1VQ0ggV0FURVIgVE8gQUREIC0gS09MQSAtIENMQVkgLSAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiV0hFTiBBTkQgSE9XIE1VQ0ggV0FURVIgVE8gQUREIC0gS09MQSAtIFNBTkQgLSAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiV0hFTiBBTkQgSE9XIE1VQ0ggV0FURVIgVE8gQUREIC0gREVHQSAtIFNBTkQgLSAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiV0hFTiBBTkQgSE9XIE1VQ0ggV0FURVIgVE8gQUREIC0gS09MQSAtIExPQU0gLSAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiV0hFTiBBTkQgSE9XIE1VQ0ggV0FURVIgVE8gQUREIC0gV09ZRU5BREVHQSAtIENMQVkgLSAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiV0hFTiBBTkQgSE9XIE1VQ0ggV0FURVIgVE8gQUREIC0gV09ZRU5BREVHQSAtIExPQU0gLSAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiV0hFTiBBTkQgSE9XIE1VQ0ggV0FURVIgVE8gQUREIC0gV09ZRU5BREVHQSAtIFNBTkQgLSAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiV0hFTiBUTyBIQVJWRVNUIC0gIiwgIiIpCgojZml4aW5nIGV4dHJhIGNoYW5nZXMKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2VfYWxsKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIiAiLCAiIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2VfYWxsKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIldDIiwgIkMiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZV9hbGwoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiV0ciLCAiRyIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlX2FsbChjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJXTyIsICJPIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2VfYWxsKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIldQIiwgIlAiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZV9hbGwoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiV1QiLCAiVCIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlX2FsbChjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJXSEVBRENBQkJBR0UiLCAiSEVBRENBQkJBR0UiKQoKI0FERElORyBUSEUgTlVNQkVSUwojQURESU5HIFRIRSBOVU1CRVJTCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIlBPVEFUTyIsICIxIC0gUE9UQVRPIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiQ0FSUk9UIiwgIjIgLSBDQVJST1QiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJPTklPTiIsICIzIC0gT05JT04iKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJHQVJMSUMiLCAiNCAtIEdBUkxJQyIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIlRPTUFUTyIsICI1IC0gVE9NQVRPIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiUEVQUEVSIiwgIjYgLSBQRVBQRVIgT1BUSU9OIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiSEVBRENBQkJBR0UiLCAiNyAtIEhFQUQgQ0FCQkFHRSIpCgoKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiQkFSTEVZIiwgIjEgLSBCQVJMRVkiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJNQUlaRSIsICIyIC0gTUFJWkUiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJTT1JHSFVNIiwgIjMgLSBTT1JHSFVNIikKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiVEVGIiwgIjQgLSBURUYiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJXSEVBVCIsICI1IC0gV0hFQVQiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJTRVNBTUUiLCAiNiAtIFNFU0FNRSIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIkZBVkEgQkVBTlMiLCAiNyAtIEZBVkEgQkVBTiIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIkNISUNLUEVBIiwgIjggLSBDSElDS1BFQSIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIkNPTU1PTkJFQU5TIiwgIjkgLSBDT01NT04gQkVBTlMiKQpjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjb250ZW50X2Nyb3BfcGxheWVkJGxvZ0luZm8sICJDT1RUT04iLCAiMTAgLSBDT1RUT04iKQoKY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY29udGVudF9jcm9wX3BsYXllZCRsb2dJbmZvLCAiRFVSQU1FNSAtIFdIRUFUIiwgIkRVUkFNRSBXSEVBVCIpCmNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNvbnRlbnRfY3JvcF9wbGF5ZWQkbG9nSW5mbywgIk1BTFQxIC0gQkFSTEVZIiwgIk1BTFQgQkFSTEVZIikKCgoKP2dlb21fdGV4dApnZ3Bsb3QoY29udGVudF9jcm9wX3BsYXllZCwgYWVzKHg9ZmN0X2luZnJlcShsb2dJbmZvKSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9MSwgc2l6ZSA9IDcpKSsKICBnZW9tX2JhcihmaWxsPSdza3kgYmx1ZScpKwogIGdlb21fdGV4dChzdGF0PSdjb3VudCcsIGFlcyhsYWJlbD0uLmNvdW50Li4pLCB2anVzdD0tMSxzaXplPTMpKwogIHlsaW0oMCwyNzUwKSsKICBsYWJzKAogICAgdGl0bGUgPSAnQUxMIENyb3BzIEV2ZXIgQWNjZXNzZWQgQWNyb3NzIEFsbCBDYWxscyB3aXRoIExhYmVsZWQgQnV0dG9ucycsCiAgICB4ID0gJ0Nyb3BzJywKICAgIHk9ICdjb3VudCcKICApCmBgYAoKCgoKCiNXaGF0IGFib3V0IGEgbmljZSBjcm9wIGJyZWFrZG93biBwZXIgbW9udGg/CmBgYHtyfQoKY3JvcF9tb250aCA8LSBsb2dfZGF0YSAlPiUKICBmaWx0ZXIoZ3JlcGwoIkNST1AgTUVOVSAtICIsbG9nSW5mbykpICU+JQogIGZpbHRlcighZ3JlcGwoIkhISSIsbG9nSW5mbykpICU+JQogIGZpbHRlcighZ3JlcGwoIlJFUExBWUVEIixsb2dJbmZvKSkKCmNyb3BfbW9udGggPC0gY3JvcF9tb250aCAlPiUKICBncm91cF9ieShjYWxsZXJJZCwgbG9nSW5mbyxtb250aCkgJT4lCiAgY291bnQoKQoKY3JvcF9tb250aCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY3JvcF9tb250aCRsb2dJbmZvLCAiQ1JPUCBNRU5VIC0gIiwgIiIpCmNyb3BfbW9udGgkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNyb3BfbW9udGgkbG9nSW5mbywgIiBTRUxFQ1RFRCIsICIiKQpjcm9wX21vbnRoJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjcm9wX21vbnRoJGxvZ0luZm8sICJHTyBUTyIsICIiKQoKCmNyb3BfdHJhY2sgPC0gY3JvcF9tb250aCAlPiUKICBmaWx0ZXIobW9udGggPT0gMSkKZ2dwbG90KGNyb3BfdHJhY2ssIGFlcyh4PWxvZ0luZm8pKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPTEsIHNpemUgPSA3KSkrCiAgZ2VvbV9iYXIoKSsKICBsYWJzKAogICAgdGl0bGUgPSAnQ3JvcCBtZW51IGJyZWFrZG93biBKYW4nLAogICAgeCA9ICdDcm9wcycsCiAgICB5PSAnY291bnQnCiAgKQogIApjcm9wX3RyYWNrIDwtIGNyb3BfbW9udGggJT4lCiAgZmlsdGVyKG1vbnRoID09IDIpCmdncGxvdChjcm9wX3RyYWNrLCBhZXMoeD1sb2dJbmZvKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0xLCBzaXplID0gNykpKwogIGdlb21fYmFyKCkrCiAgbGFicygKICAgIHRpdGxlID0gJ0Nyb3AgbWVudSBicmVha2Rvd24gZmViJywKICAgIHggPSAnQ3JvcHMnLAogICAgeT0gJ2NvdW50JwogICkKY3JvcF90cmFjayA8LSBjcm9wX21vbnRoICU+JQogIGZpbHRlcihtb250aCA9PSAzKQpnZ3Bsb3QoY3JvcF90cmFjaywgYWVzKHg9bG9nSW5mbykpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9MSwgc2l6ZSA9IDcpKSsKICBnZW9tX2JhcigpKwogIGxhYnMoCiAgICB0aXRsZSA9ICdDcm9wIG1lbnUgYnJlYWtkb3duIG1hcicsCiAgICB4ID0gJ0Nyb3BzJywKICAgIHk9ICdjb3VudCcKICApCmNyb3BfdHJhY2sgPC0gY3JvcF9tb250aCAlPiUKICBmaWx0ZXIobW9udGggPT0gNCkKZ2dwbG90KGNyb3BfdHJhY2ssIGFlcyh4PWxvZ0luZm8pKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPTEsIHNpemUgPSA3KSkrCiAgZ2VvbV9iYXIoKSsKICBsYWJzKAogICAgdGl0bGUgPSAnQ3JvcCBtZW51IGJyZWFrZG93biBhcHJpbCcsCiAgICB4ID0gJ0Nyb3BzJywKICAgIHk9ICdjb3VudCcKICApCmNyb3BfdHJhY2sgPC0gY3JvcF9tb250aCAlPiUKICBmaWx0ZXIobW9udGggPT0gNSkKZ2dwbG90KGNyb3BfdHJhY2ssIGFlcyh4PWxvZ0luZm8pKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPTEsIHNpemUgPSA3KSkrCiAgZ2VvbV9iYXIoKSsKICBsYWJzKAogICAgdGl0bGUgPSAnQ3JvcCBtZW51IGJyZWFrZG93biBtYXknLAogICAgeCA9ICdDcm9wcycsCiAgICB5PSAnY291bnQnCiAgKQpjcm9wX3RyYWNrIDwtIGNyb3BfbW9udGggJT4lCiAgZmlsdGVyKG1vbnRoID09IDYpCmdncGxvdChjcm9wX3RyYWNrLCBhZXMoeD1sb2dJbmZvKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0xLCBzaXplID0gNykpKwogIGdlb21fYmFyKCkrCiAgbGFicygKICAgIHRpdGxlID0gJ0Nyb3AgbWVudSBicmVha2Rvd24ganVuZScsCiAgICB4ID0gJ0Nyb3BzJywKICAgIHk9ICdjb3VudCcKICApCmNyb3BfdHJhY2sgPC0gY3JvcF9tb250aCAlPiUKICBmaWx0ZXIobW9udGggPT0gNykKZ2dwbG90KGNyb3BfdHJhY2ssIGFlcyh4PWxvZ0luZm8pKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPTEsIHNpemUgPSA3KSkrCiAgZ2VvbV9iYXIoKSsKICBsYWJzKAogICAgdGl0bGUgPSAnQ3JvcCBtZW51IGJyZWFrZG93biBqdWx5JywKICAgIHggPSAnQ3JvcHMnLAogICAgeT0gJ2NvdW50JwogICkKY3JvcF90cmFjayA8LSBjcm9wX21vbnRoICU+JQogIGZpbHRlcihtb250aCA9PSA4KQpnZ3Bsb3QoY3JvcF90cmFjaywgYWVzKHg9bG9nSW5mbykpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9MSwgc2l6ZSA9IDcpKSsKICBnZW9tX2JhcigpKwogIGxhYnMoCiAgICB0aXRsZSA9ICdDcm9wIG1lbnUgYnJlYWtkb3duIGF1ZycsCiAgICB4ID0gJ0Nyb3BzJywKICAgIHk9ICdjb3VudCcKICApCmNyb3BfdHJhY2sgPC0gY3JvcF9tb250aCAlPiUKICBmaWx0ZXIobW9udGggPT0gOSkKZ2dwbG90KGNyb3BfdHJhY2ssIGFlcyh4PWxvZ0luZm8pKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPTEsIHNpemUgPSA3KSkrCiAgZ2VvbV9iYXIoKSsKICBsYWJzKAogICAgdGl0bGUgPSAnQ3JvcCBtZW51IGJyZWFrZG93biBzZXAnLAogICAgeCA9ICdDcm9wcycsCiAgICB5PSAnY291bnQnCiAgKQpjcm9wX3RyYWNrIDwtIGNyb3BfbW9udGggJT4lCiAgZmlsdGVyKG1vbnRoID09IDEwKQpnZ3Bsb3QoY3JvcF90cmFjaywgYWVzKHg9bG9nSW5mbykpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9MSwgc2l6ZSA9IDcpKSsKICBnZW9tX2JhcigpKwogIGxhYnMoCiAgICB0aXRsZSA9ICdDcm9wIG1lbnUgYnJlYWtkb3duIG9jdCcsCiAgICB4ID0gJ0Nyb3BzJywKICAgIHk9ICdjb3VudCcKICApCmNyb3BfdHJhY2sgPC0gY3JvcF9tb250aCAlPiUKICBmaWx0ZXIobW9udGggPT0gMTEpCmdncGxvdChjcm9wX3RyYWNrLCBhZXMoeD1sb2dJbmZvKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0xLCBzaXplID0gNykpKwogIGdlb21fYmFyKCkrCiAgbGFicygKICAgIHRpdGxlID0gJ0Nyb3AgbWVudSBicmVha2Rvd24gbm92JywKICAgIHggPSAnQ3JvcHMnLAogICAgeT0gJ2NvdW50JwogICkKY3JvcF90cmFjayA8LSBjcm9wX21vbnRoICU+JQogIGZpbHRlcihtb250aCA9PSAxMikKZ2dwbG90KGNyb3BfdHJhY2ssIGFlcyh4PWxvZ0luZm8pKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPTEsIHNpemUgPSA3KSkrCiAgZ2VvbV9iYXIoKSsKICBsYWJzKAogICAgdGl0bGUgPSAnQ3JvcCBtZW51IGJyZWFrZG93biBkZWMnLAogICAgeCA9ICdDcm9wcycsCiAgICB5PSAnY291bnQnCiAgKQoKCmBgYAoK